해당 게시물은 [제대로 파는 자바 (Java) - by 얄코]를 수강한 내용을 바탕으로 작성하였습니다.
블록 block
- 0개 이상의 문 statement 들을 묶은 단위
- 제어문, 함수, 클래스 등에 사용
- 새로운 스코프 생성
public class Ex01 {
public static void main(String[] args) {
// 💡 { } 로 블록 생성
{
int x = 1;
System.out.println(x);
}
{
int intNum = 123;
String str = "블록 밖은 위험해";
}
// 💡 블록 안에서 선언된 것은 밖에서 사용 불가
intNum = 234;
System.out.println(str);
String x = "전국구 보스";
{
String y = "동네 양아치";
// 💡 블록 안쪽에서는 바깥의 것 사용 가능
System.out.println(x);
System.out.println(y);
}
System.out.println(x);
System.out.println(y); // ⚠️ 불가
int z = 1;
for (int i = 0; i < 5; i++) {
System.out.println(z + i);
}
System.out.println(i); // ⚠️ 불가
}
메소드와 클래스의 스코프
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); // ⚠️
}
}
자바에서는 바깥의 변수 재선언 불가
public class Ex03 {
public static void main(String[] args) {
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
);
}
}
여우 라인을 지우고 실행해보면 this.king 뿐만 아니라 king도 사자