블록 및 스코프 설명
- 0개 이상의 문을 묶은 단위를 블록이라고 한다.
- 새로운 스코프를 생성한다.
- 스코프 : 변수가 사용될 수 있는 범위를 말한다.
- 블록안의 변수의 스코프는 블록바깥을 벗어나지 못하고 있다.
외부의 변수는 내부 블록에서 사용가능하나, 블록내의 변수는 외부에서 사용 불가능.
String x = "전국구 보스";
{
String y = "동네 양아치";
// 💡 블록 안쪽에서는 바깥의 것 사용 가능
System.out.println(x);
System.out.println(y);
}
System.out.println(x);
System.out.println(y); // ⚠️ 불가
메서드와 클래스의 스코프
public class Ex02 {
public static void main(String[] args) {
System.out.println(a); // ⚠️ 클래스 메소드에서 인스턴스 필드 사용 불가
}
private String y = x; // ⚠️ 클래스 내 필드의 스코프 : 해당 클래스 안
private int a = 1;
private int b = a + 1;
private int c = d + 1; // ⚠️ 메소드 내 변수의 스코프 : 해당 메소드 안
public void func1 () {
System.out.println(a + b);
int d = 2;
}
public void func2 () {
System.out.println(d); // ⚠️
}
}
- a는 인스턴스 필드라서 메인 메서드(static이 붙어있는 클래스메서드)에서 바로 사용 불가능.
- x는 다른 클래스에서 선언된 변수라서 해당 클래스에서는 사용 불가능. 클래스내 필드 스코프는 해당 클래스 안이라서.
- 메서드 안에서 생성된 변수는 스코프가 해당 메서드 안이다.
- 단 클래스에서 선언된 필드들은 메서드 안에서도 사용가능.
스코프와 변수 재선언에 관하여
String str = "바깥쪽";
{
String str = "안쪽"; // ⚠️ 불가
}
while (true) {
String str = "안쪽"; // ⚠️ 불가
}
- 바깥의 변수를 블록 내부에서 같은필드를 재선언 할 수는 없다.
클래스의 영역과 메서드내 영역은 다른 영역으로 간주
public class Ex04 {
public static void main(String[] args) {
new Ex04().printKings();
}
String king = "사자";
void printKings () {
String king = "여우"; // 💡 그럼 이건 뭔가요??
// ⭐️ 인스턴스의 필드는 다른 영역으로 간주
System.out.printf(
"인스턴스의 왕은 %s, 블록의 왕은 %s%n",
this.king, king
);
}
}
- 클래스필드 king과 메서드내 필드 king은 엄연히 다른 영역이라서 재선언이 아니라 별개의 선언으로 본다.
'얄코의 제대로 파는 자바 > 섹션6 클래스 더 알아보기' 카테고리의 다른 글
열거형 (0) | 2024.04.17 |
---|---|
메인 메소드 (0) | 2024.04.15 |
익명클래스 (0) | 2024.04.08 |
내부클래스 (0) | 2024.04.07 |
패키지 (0) | 2024.04.02 |