자바 코드를 작성하는 곳에는 특정한 고유 영역이 존재합니다. 이것을 범위 즉 스코프(scope)라고 부르는데요. 현대 프로그래밍 언어에는 스코프가 존재합니다. 이번 강의는 자바의 스코프에 대한 기초 개념을 배워봅시다.
ㅤ
스코프(scope) 는 변수에 접근하기 위한 유효범위를 말하며 중괄호 내부를 하나의 범위로 볼 수 있습니다. 스코프의 특성은 범위 내에서는 범위 외부에 선언된 변수에 접근할 수 있으나 범위 외부에서는 범위 내부에 선언된 변수에 접근할 수 없습니다. 어려운 개념이 아닙니다.
먼저 변수의 접근이란 변수를 읽거나 저장할 수 있는 것을 말하며 기본적으로 같은 범위 내에서는 변수에 접근할 수 있습니다.
그러나 외부 범위에서는 내부 범위에 있는 변수에 접근할 수 없습니다.
반복문의 내부 범위에서는 외부 범위에 있는 변수에 접근할 수 있습니다.
조건문의 내부 범위에서도 외부 범위에 있는 변수에 접근할 수 있습니다.
조건문 내부에서는 외부 범위인 box 변수에 접근할 수 있고, chickenBox 변수에 접근할 수 있으나 외부 범위에서는 내부 범위에 선언된 number 변수나 chickenBox 변수에 접근할 수 없습니다.
반복문 내부에 있는 변수는 반복문이 실행될 때마다 초기화를 반복합니다.
ㅤ
실습도구에 해당 코드를 작성해 봅시다
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int box = 1;
if (true) {
int chickenBox = 5;
System.out.println(chickenBox);
}
chickenBox = 10;
System.out.println(chickenBox);
출력
[직접 작성후 확인해보세요]
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int box = 1;
if (true) {
int chickenBox = 20;
if (true) {
int number = 0;
int result = box + number + chickenBox;
}
number = 1;
}
chickenBox = 10;
출력
[직접 작성후 확인해보세요]
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int x = 0; // 상위
while (x < 20) {
int x = 1; // 하위
System.out.println(x);
x++;
}
출력
[직접 작성후 확인해보세요]
설명
x라는 변수는 while
반복문 내에서 상위의 x 변수 스코프에 접근이 가능하기 때문에 while
반복문 내에서 x 변수를 재정의할 수 없습니다.
ㅤ
코드 작성
// 1을 계속 출력하는 이유
int i = 0;
while (i < 20) {
int number = 1;
System.out.println(number);
number++;
i++;
}
출력
[직접 작성후 확인해보세요]
설명
반복문이 실행되면서 number 변수의 생성 및 소멸도 반복하기 때문에 항상 1을 출력합니다.
안녕하세요. case4에서 number라는 변수룰 출력하고 값을 변화시키는 행위가 없기 때문에 number++나 number--와 같이 값을 변화시켜주는 행위를 추가해주는 것이 설명에 더 부합하는 코드가 아닐까 생각합니다.
안녕하세요. 코드라떼입니다 :) 좋은 의견 감사합니다 !
can not find symbol 에러에서 symbol이 의미하는 것이 변수인가요?
자바를 실행시키는 가상머신에서는 symbol이라는 단위와 명칭을 사용하나, 변수라고 생각하셔도 무방합니다. 감사합니다^^
case 2 int box = 1; //박스는 int = 1;로 정의되었고 if (true) { //이하의 if 조건문에서 int chickenBox = 20; 일 때(참) int chickenBox = 20; if (true) { //위의 조건이 참일 때 다시 if 조건문이 생겨ㅓ int number = 0; //int number = 0;으로 정의되고 int result = box + number + chickenBox; //그 결과 result가 box + number + chickenBox로 정의 } //되었다고 생각합니다. number = 1; //제 질문은 지금 number = 1;은 두 번째 if문에서 int number=1; } //로 정의되었기 때문에 1이 아닌 0이 되어야된다 생각하고 chickenBox = 10; //chickenBox는 10이 아닌 20으로 정의되어야 한다 생각합니다 //제 생각이 맞는지 궁금합니다 두서없이 적어 죄송합니다 ㅠㅠ
안녕하세요^^ 코드라떼 입니다. 해당 예제 코드는 스코프와 관련된 문제로 number = 1, chickenBox = 10 코드에서 어떤 값이냐 상관없이 해당 변수에 접근할 수 있는지 없는지에 관련된 예제입니다. number = 1, chickenBox = 10 해당 코드의 의미는 'number 변수에 1로 값을 덮어써라, chicken 변수에 10의 값을 덮어써라' 라는 의미입니다. 그러나 if 문 외부에서는 number 또는 chicken으로 선언된 변수가 존재하지 않기 때문에 결론적으로 하단에 있는 number = 1, chickenBox = 10 코드는 접근(수정 또는 읽기) 자체가 불가능합니다.그래서 해당 코드를 실행시 'cannot find symbol' 에러가 발생합니다. 여기서 symbol은 쉽게 말씀드리면 변수명을 말할 수 있으며 변수를 찾을 수 없다는 에러를 확인할 수 있습니다. 감사합니다^^
자바 코드를 작성하는 곳에는 특정한 고유 영역이 존재합니다. 이것을 범위 즉 스코프(scope)라고 부르는데요. 현대 프로그래밍 언어에는 스코프가 존재합니다. 이번 강의는 자바의 스코프에 대한 기초 개념을 배워봅시다.
ㅤ
스코프(scope) 는 변수에 접근하기 위한 유효범위를 말하며 중괄호 내부를 하나의 범위로 볼 수 있습니다. 스코프의 특성은 범위 내에서는 범위 외부에 선언된 변수에 접근할 수 있으나 범위 외부에서는 범위 내부에 선언된 변수에 접근할 수 없습니다. 어려운 개념이 아닙니다.
먼저 변수의 접근이란 변수를 읽거나 저장할 수 있는 것을 말하며 기본적으로 같은 범위 내에서는 변수에 접근할 수 있습니다.
그러나 외부 범위에서는 내부 범위에 있는 변수에 접근할 수 없습니다.
반복문의 내부 범위에서는 외부 범위에 있는 변수에 접근할 수 있습니다.
조건문의 내부 범위에서도 외부 범위에 있는 변수에 접근할 수 있습니다.
조건문 내부에서는 외부 범위인 box 변수에 접근할 수 있고, chickenBox 변수에 접근할 수 있으나 외부 범위에서는 내부 범위에 선언된 number 변수나 chickenBox 변수에 접근할 수 없습니다.
반복문 내부에 있는 변수는 반복문이 실행될 때마다 초기화를 반복합니다.
ㅤ
실습도구에 해당 코드를 작성해 봅시다
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int box = 1;
if (true) {
int chickenBox = 5;
System.out.println(chickenBox);
}
chickenBox = 10;
System.out.println(chickenBox);
출력
[직접 작성후 확인해보세요]
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int box = 1;
if (true) {
int chickenBox = 20;
if (true) {
int number = 0;
int result = box + number + chickenBox;
}
number = 1;
}
chickenBox = 10;
출력
[직접 작성후 확인해보세요]
ㅤ
코드 작성
// 실행할 수 없는 코드. 어떤 에러가 나올까요?
int x = 0; // 상위
while (x < 20) {
int x = 1; // 하위
System.out.println(x);
x++;
}
출력
[직접 작성후 확인해보세요]
설명
x라는 변수는 while
반복문 내에서 상위의 x 변수 스코프에 접근이 가능하기 때문에 while
반복문 내에서 x 변수를 재정의할 수 없습니다.
ㅤ
코드 작성
// 1을 계속 출력하는 이유
int i = 0;
while (i < 20) {
int number = 1;
System.out.println(number);
number++;
i++;
}
출력
[직접 작성후 확인해보세요]
설명
반복문이 실행되면서 number 변수의 생성 및 소멸도 반복하기 때문에 항상 1을 출력합니다.
안녕하세요. case4에서 number라는 변수룰 출력하고 값을 변화시키는 행위가 없기 때문에 number++나 number--와 같이 값을 변화시켜주는 행위를 추가해주는 것이 설명에 더 부합하는 코드가 아닐까 생각합니다.
안녕하세요. 코드라떼입니다 :) 좋은 의견 감사합니다 !
can not find symbol 에러에서 symbol이 의미하는 것이 변수인가요?
자바를 실행시키는 가상머신에서는 symbol이라는 단위와 명칭을 사용하나, 변수라고 생각하셔도 무방합니다. 감사합니다^^
case 2 int box = 1; //박스는 int = 1;로 정의되었고 if (true) { //이하의 if 조건문에서 int chickenBox = 20; 일 때(참) int chickenBox = 20; if (true) { //위의 조건이 참일 때 다시 if 조건문이 생겨ㅓ int number = 0; //int number = 0;으로 정의되고 int result = box + number + chickenBox; //그 결과 result가 box + number + chickenBox로 정의 } //되었다고 생각합니다. number = 1; //제 질문은 지금 number = 1;은 두 번째 if문에서 int number=1; } //로 정의되었기 때문에 1이 아닌 0이 되어야된다 생각하고 chickenBox = 10; //chickenBox는 10이 아닌 20으로 정의되어야 한다 생각합니다 //제 생각이 맞는지 궁금합니다 두서없이 적어 죄송합니다 ㅠㅠ
안녕하세요^^ 코드라떼 입니다. 해당 예제 코드는 스코프와 관련된 문제로 number = 1, chickenBox = 10 코드에서 어떤 값이냐 상관없이 해당 변수에 접근할 수 있는지 없는지에 관련된 예제입니다. number = 1, chickenBox = 10 해당 코드의 의미는 'number 변수에 1로 값을 덮어써라, chicken 변수에 10의 값을 덮어써라' 라는 의미입니다. 그러나 if 문 외부에서는 number 또는 chicken으로 선언된 변수가 존재하지 않기 때문에 결론적으로 하단에 있는 number = 1, chickenBox = 10 코드는 접근(수정 또는 읽기) 자체가 불가능합니다.그래서 해당 코드를 실행시 'cannot find symbol' 에러가 발생합니다. 여기서 symbol은 쉽게 말씀드리면 변수명을 말할 수 있으며 변수를 찾을 수 없다는 에러를 확인할 수 있습니다. 감사합니다^^