Coram Deo

ch 6-26~31 [객체지향 개념] - static 메서드, 인스턴스 메서드, 오버로딩 본문

자바의 정석

ch 6-26~31 [객체지향 개념] - static 메서드, 인스턴스 메서드, 오버로딩

탁탁슝 2022. 11. 1. 21:14

ch 6-26 static 메서드와 인스턴스 메서드

인스턴스 메서드

  • 인스턴스 생성 후, 참조변수.메서드이름()으로 호출
  • 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수(iv) 사용가능

static 메서드 (클래스 메서드)

  • 객체 생성없이 '클래스이름.메서드이름()'으로 호출
  • 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수(iv) 사용불가

* 인스턴스 메서드와 static 메서드의 가장 큰 차이는 "iv 사용여부"이다.

iv를 사용하려면 객체를 생성해야 하는데 static 메서드는 객체생성없이 사용하기 때문에 iv를 사용할 수 없다.

대신 매개변수를 통해 지역변수(lv)를 사용한다.

* 객체는 iv의 묶음이라고 말할 수 있다.

 

ch 6-28 static을 언제 붙여야 할까?

- 속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.

예시) 카드의 속성 : 무늬, 숫자, 폭, 높이 

무늬와 숫자는 카드마다 다르지만, 폭과 높이는 공통 속성이므로 static을 붙인다.

- 인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.

 

 

ch 6-29 메서드 간의 호출과 참조

static 메서드는 인스턴스 변수(iv)를 사용할 수 없다.

static 메서드는 다른 static 메서드는 호출할 수 있지만, 인스턴스 메서드(im)는 호출할 수 없다.

인스턴스 메서드는 static 메서드를 호출할 수 있다.

* static 메서드가 인스턴스 멤버를 쓸 수 없는 이유 : static 메서드 호출시 객체(iv묶음)가 없을 수도 있어서.

 

 

ch 6-30 오버로딩(overloading)

한 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것

조건 : 메서드 이름이 같아야 함.

          매개변수 개수가 다르거나, 매개변수 타입이 달라야 함.

          반환타입은 상관없음

 

메서드 이름은 거의 동사로 되어있음. 예시) add, println, round, random 등

그 이유는 메서드는 작업을 하는 명령문이기 때문임.

즉 메서드의 이름이 같다는 것은 하는 작업이 같다는 뜻.

 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능수행

 

만약 오버로딩한 메서드의 매개변수를 정확하게 입력하지 않았을 경우, ambiguous 하다고 한다.

// Ex) Overloading -> ambiguous
long add(int a, long b){...}
long add(long a, int b){...}

// 두 메서드 중 어떤 것을 호출해야할지 애매(ambiguous)하여 에러남
add(3, 3);

// 따라서 정확하게 입력해줘야 함.
add(3L, 3);
add(3, 3L);

밑의 코드에서 add 메서드가 먼저 호출된 후 println 메서드가 호출된다.

이해가 안되면 풀어서 써보기. int result에 mm.add(3L,3) 값을 대입한 후 result 출력하는 것과 같음.

system.out.println("mm.add(3, 3) 결과:" + mm.add(3L,3));