[자바 무료 강의] 상수는 닫힌 상자이다 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상수는 닫힌 상자이다최종수정일 2021-11-21
아이콘약 2분

자바의 상수에는 리터럴과 심볼릭 상수가 있습니다. 앞으로 상수라고 하면 리터럴과 심볼릭 상수를 생각하시면 됩니다.

추가 노트

1. 상수


image 변수가 변할 수 있는 수라면 상수는 변할 수 없는 수를 뜻합니다. 자바의 상수에는 리터럴심볼릭 상수가 있습니다.


2. 리터럴(literal)


image 리터럴은 값 또는 리터럴 값이라고 불립니다. 리터럴의 종류에는 정수, 실수, 문자, 문자열, 불리언이 있으며 변할 수 없는 값입니다.


정수

100

실수

1.2184

문자

'A'
'가'
'오'

문자열

"코드라떼"

불리언

true
false

2-1. 변수와 리터럴의 차이

image

리터럴은 변수가 아니라 상수이므로 리터럴에 리터럴을 대입할 수 없습니다.


3. 심볼릭 상수(Symbolic)


image

변수 앞에 final 키워드를 붙인 변수는 값이 저장된 이후에 값을 변경할 수 없습니다. 이 변수는 이름이 붙은(상징적인) 상수로 볼 수 있으므로 이것을 심볼릭 상수라고 합니다.


선언 시 값을 초기화

final int num = 1;

num = 4; // 변경할 수 없다.

선언 후 값을 초기화

final int num;
num = 1;

num = 4; // 변경할 수 없다.
도전자 질문
아이콘code_latte(2023-03-25 21:52 작성됨)
2023.03.25 : 수강 완료
아이콘자꿀(2022-01-26 20:11 작성됨)
리터럴에 리터럴을 대입할 수 없다고 하였는데
String A = "Hello";
System.our.println(A); 를 실행시켰을 경우
Hello 결과가 나옵니다.
A = "Hello"라고 하였을 때는 오류가 발생하던데 
String A = "Hello"라고 하였을 때는 앞에 String이 있으므로 변수로 지정되고 없을 경우 리터럴로 인식이 되는건가요?
아이콘코드라떼(2022-01-27 16:30 작성됨)
안녕하세요. 코드라떼입니다.

리터럴은 값을 의미합니다.
예시로 "a" = "hello" 같이 값에 값을 대입할 수 없습니다.

그리고 변수의 선언에 대한 개념과 변수에 값을 덮어쓰기하는 개념을 자세히 잡지 않고 그냥 넘어오신 것으로 보입니다.

String A = "Hello";
해당 코드는 문자열을 저장하는 A 변수를 선언하고 해당 변수에 "Hello" 문자열을 저장한다는 느낌으로 보시면 됩니다.

A = "Hello";
해당 코드는 변수를 선언하는 것이 아니라 기존의 A 변수에 "Hello" 문자열을 저장하는 것을 의미합니다.

변수가 선언 되어야지 값을 저장할 수 있습니다.

감사합니다.
아이콘감자도리야(2021-12-16 17:12 작성됨)
다른 곳 질문을 실수로 이곳에 잘못올렸습니다. 
아이콘코드라떼(2022-02-26 22:36 작성됨)
아이콘강낭콩(2021-09-16 20:40 작성됨)
자바에서 이미 구현된 자료구조 클래스들을 까서 공부하다가 궁금한 점이 생겼습니다.
자바의 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키워드가 붙어있는데, 단순히 불변 객체로 사용하기 위함인가요??
아이콘코드라떼(2021-09-17 00:01 작성됨)
안녕하세요. 코드라떼입니다 :)

이미 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; <- 얘는 이후에 값이 변하겠구나!

    ...
}
다만 구현체가 해당 규칙으로 완전히 통일되게 작성되어 있지는 않습니다.

감사합니다 :)

이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

코드를 실행 시 에러가 발생할 겁니다. final 키워드를 삭제해보세요.

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상수는 닫힌 상자이다최종수정일 2021-11-21
아이콘약 2분

자바의 상수에는 리터럴과 심볼릭 상수가 있습니다. 앞으로 상수라고 하면 리터럴과 심볼릭 상수를 생각하시면 됩니다.

추가 노트

1. 상수


image 변수가 변할 수 있는 수라면 상수는 변할 수 없는 수를 뜻합니다. 자바의 상수에는 리터럴심볼릭 상수가 있습니다.


2. 리터럴(literal)


image 리터럴은 값 또는 리터럴 값이라고 불립니다. 리터럴의 종류에는 정수, 실수, 문자, 문자열, 불리언이 있으며 변할 수 없는 값입니다.


정수

100

실수

1.2184

문자

'A'
'가'
'오'

문자열

"코드라떼"

불리언

true
false

2-1. 변수와 리터럴의 차이

image

리터럴은 변수가 아니라 상수이므로 리터럴에 리터럴을 대입할 수 없습니다.


3. 심볼릭 상수(Symbolic)


image

변수 앞에 final 키워드를 붙인 변수는 값이 저장된 이후에 값을 변경할 수 없습니다. 이 변수는 이름이 붙은(상징적인) 상수로 볼 수 있으므로 이것을 심볼릭 상수라고 합니다.


선언 시 값을 초기화

final int num = 1;

num = 4; // 변경할 수 없다.

선언 후 값을 초기화

final int num;
num = 1;

num = 4; // 변경할 수 없다.
도전자 질문
아이콘code_latte(2023-03-25 21:52 작성됨)
2023.03.25 : 수강 완료
아이콘자꿀(2022-01-26 20:11 작성됨)
리터럴에 리터럴을 대입할 수 없다고 하였는데
String A = "Hello";
System.our.println(A); 를 실행시켰을 경우
Hello 결과가 나옵니다.
A = "Hello"라고 하였을 때는 오류가 발생하던데 
String A = "Hello"라고 하였을 때는 앞에 String이 있으므로 변수로 지정되고 없을 경우 리터럴로 인식이 되는건가요?
아이콘코드라떼(2022-01-27 16:30 작성됨)
안녕하세요. 코드라떼입니다.

리터럴은 값을 의미합니다.
예시로 "a" = "hello" 같이 값에 값을 대입할 수 없습니다.

그리고 변수의 선언에 대한 개념과 변수에 값을 덮어쓰기하는 개념을 자세히 잡지 않고 그냥 넘어오신 것으로 보입니다.

String A = "Hello";
해당 코드는 문자열을 저장하는 A 변수를 선언하고 해당 변수에 "Hello" 문자열을 저장한다는 느낌으로 보시면 됩니다.

A = "Hello";
해당 코드는 변수를 선언하는 것이 아니라 기존의 A 변수에 "Hello" 문자열을 저장하는 것을 의미합니다.

변수가 선언 되어야지 값을 저장할 수 있습니다.

감사합니다.
아이콘감자도리야(2021-12-16 17:12 작성됨)
다른 곳 질문을 실수로 이곳에 잘못올렸습니다. 
아이콘코드라떼(2022-02-26 22:36 작성됨)
아이콘강낭콩(2021-09-16 20:40 작성됨)
자바에서 이미 구현된 자료구조 클래스들을 까서 공부하다가 궁금한 점이 생겼습니다.
자바의 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키워드가 붙어있는데, 단순히 불변 객체로 사용하기 위함인가요??
아이콘코드라떼(2021-09-17 00:01 작성됨)
안녕하세요. 코드라떼입니다 :)

이미 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; <- 얘는 이후에 값이 변하겠구나!

    ...
}
다만 구현체가 해당 규칙으로 완전히 통일되게 작성되어 있지는 않습니다.

감사합니다 :)

이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

코드를 실행 시 에러가 발생할 겁니다. final 키워드를 삭제해보세요.

Output
root$