Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

자바의 정석 - CH6 객체지향 언어 1 - 2 본문

자바

자바의 정석 - CH6 객체지향 언어 1 - 2

JANNNNNN 2023. 4. 7. 17:07

3. 변수와 메서드

변수의 선언 위치가 변수의 종류와 범위를 결정한다.

클래스 영역에서 선언하면 인스턴스 변수 혹은 클래스변수이다(공유변수). 메서드 영역은 지역변수.

인스턴스변수(instance variable)

- 인스턴스 생성 후, 참조변수.인스턴스변수명으로 접근해야한다.

- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해자동제거됨

클래스변수(class variable)

- 같은 클래스의 모든 인스턴스들이 공유하는 변수

- 인스턴스 생성없이 클래스이름.클래스변수명으로 접근할 수 있다.

- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸

지역변수(local variable)

- 메서드 내에 선언되며, 메서드의 종료와 함께 소멸

- 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸

 

클래스 변수와 인스턴스 변수 차이점

인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

또 인스턴스는 참조변수.인스턴스변수명’ 접근, 클래스 변수는 바로 클래스이름.클래스변수명’로 접근가능.

인스턴스 변수와 클래스 변수

위와 같이, 카드의 폯과 높이가 동일하므로 static으로 선언한다.

 

메서드 : 클래스 영역에만 정의할 수 있다.

메서드 호출 방법

1. 참조변수.메서드 이름(); // 메서드에 선언된 매개변수가 없는 경우

2. 참조변수.메서드 이름(값1, 값2..); // 메서드에 선언된 매개변수가 있는 경

 

메서드를 정의하는 방법

return : 만나면 현재 실행중인 메서드를 종료하고 호출한 메서드로 돌아간다.

- 반환 값이 있는 메서드는 모두 return이 있어야한다.

- 없는 경우는 void로 return문이 없어도 된다.

 

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.

참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.

참조형 반환타입

+ 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.

 

3 - 2 인스턴스 변수 VS 클래스변수 차이점

Cv vs Iv vs iv

변수가 선언된 위치를 보면 변수의 종류를 알 수 있다. 

인스턴스 변수 : 클래스 블럭 내에 선언된 변수

클래스 변수 : static이 붙은 변수

지역 변수 : 나머지 변수

인스턴스변수

int x; int y; => 인스턴스 변수는 class 내에서 선언 가능. (static없이)

Mypoint() => 이후 새로운 생성자에서 인스턴스를 참조변수 this로 객체들을 초기화 하는 것.

  +생성자는 클래스명과 이름 같아야하며, 클래스에 생성자는 필수임. 

  +this는 인스턴스메서드에서만 사용 가능

double getDistance(int x1, int y1) => 메서드에서 static이 안붙어 있으니 인스턴스 메서드이다.

메서드 내에서 인스턴스 변수를 사용하므로 static를 붙일 수 없다.

  +void가 없으니 return 값을 생성해주어야한다.(메서드에 return값은 필수)

Mypoint p = new Mypoint(1,1); => 인스턴스 변수는 참조변수.클래스명으로 접근 가능하기 때문에 참조변수 생성

sysout(p.getDistance(2,2)); => 인스턴스 변수는 참조변수.클래스명으로 접근 가능.

클래스변수

static double getDistance => static이 붙은 것을 보아, 클래스메소드임 (x, y는 지역변수)

  +클래스변수는 객체 생성 필요없이 바로 사용가능하기 때문에 따로 객체 생성하지 않아도 됨.

  +void가 없으니 return 값을 생성해주어야한다.(메서드에 return값은 필수)

sysout(getDistance(1, 1, 2, 2)); => 클래스메소드는 클래스 내에서 자유롭게 사용가능.

=> Mypoint클래스에 두 점간의 거리를 계산하는 메서드 getDistance()를 넣는다면 static 메서드 보다는 인스턴스 메서드로 정의하는 것이 더 적합하다.

4. 메서드 오버로딩

오버로딩의 조건

- 메서드의 이름이 같아야 한다.

- 매개변수의 개수 또는 타입이 달라야 한다.

- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

  (리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

오버로딩의 예시

다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계.

 

오버로딩의 잘못된 예1

매개 변수의 이름이 다른 것은 오버로딩이 아니다.

오버로딩의 잘못된 예2

리턴타입이 다른 것은 오버로딩의 성립조건이 아니다.

오버로딩의 올바른 예

매개변수는 다르지만 같은 의미의 기능을 수행하므로 오버로딩이다.