자바의 상수에는 리터럴과 심볼릭 상수가 있습니다. 앞으로 상수라고 하면 리터럴과 심볼릭 상수를 생각하시면 됩니다.
변수가 변할 수 있는 수라면 상수는 변할 수 없는 수를 뜻합니다. 자바의 상수에는 리터럴
과 심볼릭 상수
가 있습니다.
ㅤ
리터럴은 값 또는 리터럴 값이라고 불립니다. 리터럴의 종류에는 정수
, 실수
, 문자
, 문자열
, 불리언
이 있으며 변할 수 없는 값입니다.
정수
100
실수
1.2184
문자
'A'
'가'
'오'
문자열
"코드라떼"
불리언
true
false
ㅤ
리터럴은 변수가 아니라 상수이므로 리터럴에 리터럴을 대입할 수 없습니다.
ㅤ
변수 앞에 final
키워드를 붙인 변수는 값이 저장된 이후에 값을 변경할 수 없습니다. 이 변수는 이름이 붙은(상징적인) 상수로 볼 수 있으므로 이것을 심볼릭 상수
라고 합니다.
선언 시 값을 초기화
final int num = 1;
num = 4; // 변경할 수 없다.
선언 후 값을 초기화
final int num;
num = 1;
num = 4; // 변경할 수 없다.
2023.03.25 : 수강 완료
리터럴에 리터럴을 대입할 수 없다고 하였는데 String A = "Hello"; System.our.println(A); 를 실행시켰을 경우 Hello 결과가 나옵니다. A = "Hello"라고 하였을 때는 오류가 발생하던데 String A = "Hello"라고 하였을 때는 앞에 String이 있으므로 변수로 지정되고 없을 경우 리터럴로 인식이 되는건가요?
안녕하세요. 코드라떼입니다. 리터럴은 값을 의미합니다. 예시로 "a" = "hello" 같이 값에 값을 대입할 수 없습니다. 그리고 변수의 선언에 대한 개념과 변수에 값을 덮어쓰기하는 개념을 자세히 잡지 않고 그냥 넘어오신 것으로 보입니다. String A = "Hello"; 해당 코드는 문자열을 저장하는 A 변수를 선언하고 해당 변수에 "Hello" 문자열을 저장한다는 느낌으로 보시면 됩니다. A = "Hello"; 해당 코드는 변수를 선언하는 것이 아니라 기존의 A 변수에 "Hello" 문자열을 저장하는 것을 의미합니다. 변수가 선언 되어야지 값을 저장할 수 있습니다. 감사합니다.
다른 곳 질문을 실수로 이곳에 잘못올렸습니다.
자바에서 이미 구현된 자료구조 클래스들을 까서 공부하다가 궁금한 점이 생겼습니다. 자바의 LinekdList 클래스를 보면 private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; } 이런식으로 로컬 참조변수 f나 newNode에 final키워드가 붙어있는데, 단순히 불변 객체로 사용하기 위함인가요??
안녕하세요. 코드라떼입니다 :) 이미 LinkedList 코드를 오픈하셔서 볼 줄 아시기 때문에 수준에 맞게 설명드리겠습니다. final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); 말씀하신 final 키워드에 사용된 변수를 '단순히 불변 객체로 사용하기 위함'이라는 설명보단 1. f, newNode 변수에 저장된 참조값을 실수로 인해 다른 참조값으로 덮어쓰지 못하도록 하는 의도 2. 코드 양이 적기도 하고 길지도 않기 때문에 못 알아 볼 것도 아니고, 굳이 final 키워드를 명시적으로 선언하지 않아도 되긴 하지만 코드를 읽는 사람을 위해 '값이 변하지 말아야 할 변수'라는 것을 의도적으로 명확히 한 것으로 보입니다. 3. 만약에 메서드 내부의 지역 변수에 final 키워드가 존재하는 변수와 존재하지 않는 변수로 '코딩 규칙'을 정한다면 '특정 변수의 선언부'만 봤을 때 '아! 이 변수는 변수 선언 이후에 값이 변하는 변수구나! 또는 변하지 않는 변수구나!' 하고 바로 알아차리게 됩니다. 코드가 길면 길수록 읽는 사람 입장에서 더 빠른 이해가 가능합니다. [3번의 예시] 1) 이후에 변하지 않을 것을 알 수 있음 void linkLast(E e) { final Node<E> l = last; <- 얘는 이후에 값이 변하지 않겠구나! final Node<E> newNode = ... <- 얘는 이후에 값이 변하지 않겠구나! ... } 2) 이후에 변할 것을 알 수 있음 public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; Node<E> pred, succ; <- 얘는 이후에 값이 변하겠구나! ... } 다만 구현체가 해당 규칙으로 완전히 통일되게 작성되어 있지는 않습니다. 감사합니다 :)
코드를 실행 시 에러가 발생할 겁니다. final 키워드를 삭제해보세요.
자바의 상수에는 리터럴과 심볼릭 상수가 있습니다. 앞으로 상수라고 하면 리터럴과 심볼릭 상수를 생각하시면 됩니다.
변수가 변할 수 있는 수라면 상수는 변할 수 없는 수를 뜻합니다. 자바의 상수에는 리터럴
과 심볼릭 상수
가 있습니다.
ㅤ
리터럴은 값 또는 리터럴 값이라고 불립니다. 리터럴의 종류에는 정수
, 실수
, 문자
, 문자열
, 불리언
이 있으며 변할 수 없는 값입니다.
정수
100
실수
1.2184
문자
'A'
'가'
'오'
문자열
"코드라떼"
불리언
true
false
ㅤ
리터럴은 변수가 아니라 상수이므로 리터럴에 리터럴을 대입할 수 없습니다.
ㅤ
변수 앞에 final
키워드를 붙인 변수는 값이 저장된 이후에 값을 변경할 수 없습니다. 이 변수는 이름이 붙은(상징적인) 상수로 볼 수 있으므로 이것을 심볼릭 상수
라고 합니다.
선언 시 값을 초기화
final int num = 1;
num = 4; // 변경할 수 없다.
선언 후 값을 초기화
final int num;
num = 1;
num = 4; // 변경할 수 없다.
2023.03.25 : 수강 완료
리터럴에 리터럴을 대입할 수 없다고 하였는데 String A = "Hello"; System.our.println(A); 를 실행시켰을 경우 Hello 결과가 나옵니다. A = "Hello"라고 하였을 때는 오류가 발생하던데 String A = "Hello"라고 하였을 때는 앞에 String이 있으므로 변수로 지정되고 없을 경우 리터럴로 인식이 되는건가요?
안녕하세요. 코드라떼입니다. 리터럴은 값을 의미합니다. 예시로 "a" = "hello" 같이 값에 값을 대입할 수 없습니다. 그리고 변수의 선언에 대한 개념과 변수에 값을 덮어쓰기하는 개념을 자세히 잡지 않고 그냥 넘어오신 것으로 보입니다. String A = "Hello"; 해당 코드는 문자열을 저장하는 A 변수를 선언하고 해당 변수에 "Hello" 문자열을 저장한다는 느낌으로 보시면 됩니다. A = "Hello"; 해당 코드는 변수를 선언하는 것이 아니라 기존의 A 변수에 "Hello" 문자열을 저장하는 것을 의미합니다. 변수가 선언 되어야지 값을 저장할 수 있습니다. 감사합니다.
다른 곳 질문을 실수로 이곳에 잘못올렸습니다.
자바에서 이미 구현된 자료구조 클래스들을 까서 공부하다가 궁금한 점이 생겼습니다. 자바의 LinekdList 클래스를 보면 private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; } 이런식으로 로컬 참조변수 f나 newNode에 final키워드가 붙어있는데, 단순히 불변 객체로 사용하기 위함인가요??
안녕하세요. 코드라떼입니다 :) 이미 LinkedList 코드를 오픈하셔서 볼 줄 아시기 때문에 수준에 맞게 설명드리겠습니다. final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); 말씀하신 final 키워드에 사용된 변수를 '단순히 불변 객체로 사용하기 위함'이라는 설명보단 1. f, newNode 변수에 저장된 참조값을 실수로 인해 다른 참조값으로 덮어쓰지 못하도록 하는 의도 2. 코드 양이 적기도 하고 길지도 않기 때문에 못 알아 볼 것도 아니고, 굳이 final 키워드를 명시적으로 선언하지 않아도 되긴 하지만 코드를 읽는 사람을 위해 '값이 변하지 말아야 할 변수'라는 것을 의도적으로 명확히 한 것으로 보입니다. 3. 만약에 메서드 내부의 지역 변수에 final 키워드가 존재하는 변수와 존재하지 않는 변수로 '코딩 규칙'을 정한다면 '특정 변수의 선언부'만 봤을 때 '아! 이 변수는 변수 선언 이후에 값이 변하는 변수구나! 또는 변하지 않는 변수구나!' 하고 바로 알아차리게 됩니다. 코드가 길면 길수록 읽는 사람 입장에서 더 빠른 이해가 가능합니다. [3번의 예시] 1) 이후에 변하지 않을 것을 알 수 있음 void linkLast(E e) { final Node<E> l = last; <- 얘는 이후에 값이 변하지 않겠구나! final Node<E> newNode = ... <- 얘는 이후에 값이 변하지 않겠구나! ... } 2) 이후에 변할 것을 알 수 있음 public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; Node<E> pred, succ; <- 얘는 이후에 값이 변하겠구나! ... } 다만 구현체가 해당 규칙으로 완전히 통일되게 작성되어 있지는 않습니다. 감사합니다 :)
코드를 실행 시 에러가 발생할 겁니다. final 키워드를 삭제해보세요.