1. 선언이 중복되면 발생하는 오류
Random rand = new Random();
Random rand = new Random();
오류 문구:
java: variable rand is already defined in method main(java.lang.String[])
오류 발생 원인 :
- 같은 메서드 내부에서 동일한 이름의 변수를 두 번 선언하려고 했기 때문이다. Java는 같은 스코프(scope) 내에서 동일한 이름의 변수를 선언할 수 없다.
2. 선언과 정의란?
(1) 선언 (Declaration)
변수, 메서드, 클래스 등의 이름과 타입, 구조를 지정하여 컴파일러에게 해당 요소가 존재한다는 것을 알리는 작업이다.
구체적인 실행 내용(구현) 이나 메모리 할당을 반드시 포함하지 않아도 된다.
선언의 JVM 관점:
- JVM은 선언 자체를 메모리에 로드하거나 실행하지 않는다.
- 선언은 컴파일 단계에서 유효성 검사를 통해 해당 요소가 코드에서 사용 가능한지를 보장한다.
- 선언된 변수나 메서드는 구체적인 초기화나 구현 없이 실행 단계에서 사용될 수 없다.(2) 정의 (Definition):
- (1) 선언을 포함하며, 구체적인 실행 내용(구현) 또는 값의 초기화를 통해 해당 요소를 실행 가능한 상태로 만드는 작업이다.
- (2) 컴파일러에게 실행 로직을 제공하고, 런타임 시에는 JVM이 메모리를 할당하여 실행에 사용한다.
(3) JVM 관점:
변수의 정의(JVM 관점) :
JVM은 정의된 변수에 대해 메모리를 할당하고 초기값(기본값 또는 명시적 값)을 저장한다.
런타임 시 메모리에 올라가 사용 가능하다.
~~~java int number; // 변수 선언: 타입과 이름만 지정, 값 초기화 없음 int number = 10; // 변수 선언 + 정의: 초기값 10으로 메모리에 저장
메서드의 정의(JVM 관점):
JVM은 정의된 메서드의 바이트코드(Bytecode)를 생성하여 메서드 영역(Method Area)에 저장한다.
런타임에 호출될 수 있다.
public int add(int a, int b); // 메서드 선언: 이름, 반환 타입, 매개변수만 지정, 구현 없음 public int add(int a, int b) { // 메서드 선언 + 정의: 구현 포함 return a + b; }
클래스의 정의(JVM 관점):
JVM은 클래스 정의를 클래스 로더를 통해 메모리에 로드하며, 메서드 영역에 저장한다.
정의된 클래스는 인스턴스를 생성하거나 정적 멤버를 사용할 수 있다.
클래스 이름과 구조를 선언한 뒤, 필드 초기화나 메서드 구현이 포함된 상태이다.
public class MyClass; // 클래스 선언: 이름만 지정, 구현 없음 public class MyClass { // 클래스 선언 + 정의: 필드와 메서드 포함 int value = 10; // 필드 정의 public void display() { System.out.println(value); // 메서드 정의 } }
3. 스코프(scope):
- 스코프는 변수의 유효 범위를 의미하며, 변수 선언 위치에 따라 결정된다.
- 스코프의 유형:
- 클래스 스코프: 클래스 전체.
- 메서드 스코프: 메서드 내부.
- 블록 스코프: { } 블록 내부.
- 중복 선언 문제:
- 같은 스코프 안에서는 동일한 이름의 변수를 선언할 수 없다.
- 중복 선언을 피하려면 변수 이름을 변경하거나 다른 스코프에서 선언해야 한다.
'자바 > 자바 문법' 카테고리의 다른 글
new 연산자란? (1) | 2025.01.24 |
---|---|
참조 변수와 기본 자료형 변수 (0) | 2025.01.21 |
자바 throw 키워드 기초 이해. (0) | 2025.01.14 |
자바 try-catch (0) | 2025.01.14 |
컬렉션 Map의 값 여러 개 넣는 법. (0) | 2025.01.13 |