1. 변수

변수의 종류

- 지역변수(Local Variable) : 메소드 영역에 선언된 변수

- 인스턴스 변수(Instance Variable) : 클래스 영역 = 메소드 외부에 선언된 변수

- 클래스 변수(Class Variable) : static이 붙은 변수로 클래스 영역에 선언. 모든 객체 간에 공유하기 때문에 공통적인 요소일 때 사용

클래스 영역 : class 블럭 { 시작부터 } 끝까지

메소드 영역 : method 블럭 { 시작부터 } 끝까지

  지역 변수(lv) 인스턴스 변수(iv) 클래스 변수(cv)
초기화 수동 자동
(자료형의 타입에 따라 초기화되는 값이 다르다)
자동
생성 시기 변수 선언문이 수행됐을 때 객체가 생성 됐을 때★ 클래스가 메모리에 올라갔을 때
생명 주기 }(닫는 중괄호)
(메소드가 호출되어 작업하는 동안에만 사용됨)
프로그램 종료 시 프로그램 종료 시

지역변수는 메소드가 호출되어 작업하는 동안에만 사용되기 때문에 생명주기가 짧다.

지역변수는 초기화를 수동으로 해줘야 하지만, 인스턴스변수와 클래스변수는 자동으로 초기화 된다.(자료형의 타입에 따라 초기화 되는 값이 다르다)

- int > 0

- boolean > false

- double > 0.0

- String > null

클래스 변수는 자동으로 메모리에 올라가기 때문에 객체를 생성할 필요가 없다.

 

 

static

static은 인스턴스 멤버(인스턴스 변수, 인스턴스 메소드)에 붙여서 사용할 수 있다.

 

- static 메소드

객체 생성이 필요 없기 때문에 클래스 이름을 통해 호출 가능하다.

static 메소드 내에서는 인스턴스 멤버들을 사용할 수 없다.(인스턴스 멤버들은 객체 생성을 해야 사용 가능하기 때문)

static 메소드는 static 변수(cv)와 지역변수(iv)만 사용 가능

 

- 인스턴스 메소드

객체 생성 후, 참조 변수를 통해 메소드를 호출한다.

메소드 내에서 인스턴스 변수를 사용할 수 있다.

 

- 언제 static을 붙이면 될까?

변수의 경우, 객체가 공통적으로 공유해야 하는 속성에 static을 붙여서 사용

메소드의 경우, 인스턴스 멤버들을 사용하지 않을 때 static을 붙여서 사용

지역변수(lv)를 통해 작업하기 때문에 인스턴스 멤버가 필요 없다.

 

 

예제

 


 

2. 상속

두 클래스를 부모와 자식으로 관계를 맺어주는 것

기존에 선언된 클래스의 필드를 다른 클래스에서 사용하고자 할 때(코드의 재사용)

 

상속 문법

class A{   // 부모 클래스

     부모 클래스의 필드

}

class B extends A{   // 자식 클래스

     ...

}

 

A : 부모 클래스, 상위 클래스, 슈퍼 클래스

B : 자식 클래스, 하위 클래스, 서브 클래스

 

- extends : 상속의 키워드로, 부모의 인스턴스 변수를 상속받은 자식은 계속 확장된다.

 

 

상속의 특징

자식은 부모의 모든 멤버를 상속받는다.

자식의 멤버 개수는 부모의 멤버 개수보다 많거나 같다.

부모의 변경은 자식에 영향을 미치지만, 자식의 변경은 부모에 영향을 미치지 않는다.

 

 

예제 1

자식 클래스는 부모 클래스의 모든 멤버(int data, void talk())를 상속받고, 멤버를 추가해서 사용할 수 있다.

자식의 멤버 개수는 부모보다 같거나 많을 수 있으니까!

 

 

오버로딩(new)

이름만 같은 "새로운 메소드"를 정의하는 것

 

- 오버로딩의 조건

① 메소드 이름이 일치해야 한다.

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

오버로딩 메소드 사용 시, 전달된 값의 타입 혹은 개수를 알아서 구분하여 알맞은 메소드가 자동으로 호출된다.

 

 

오버라이딩(change, modify)

상속받은 부모의 메소드를 자식 클래스에서 자신에 맞게 변경하는 것

구현부(내용)만 변경할 수 있다.

 

- 오버라이딩의 조건

① 선언부(리턴타입, 메소드명, 매개변수 목록)가 부모클래스의 메소드와 일치해야 한다

② 접근 제어자를 부모클래스의 메소드보다 좁은 범위로 변경할 수 없다(public, protected, default, private).

③ 예외는 부모클래스의 메소드보다 많이 선언할 수 없다.

 

 

오버로딩과 오버라이딩 차이점

오버로딩은 같은 이름의 메소드를 '새롭게' 만드는 것. 그러므로 선언부의 매개변수이 개수와 타입을 다르게 만들 수 있다. 또한 상속과 전혀 관계가 없다.

오버라이딩은 구현부{}의 내용만 변경 가능하고, 선언부는 변경 불가능. 부모 메소드와 일치해야 한다. 또한 상속을 받았을 경우만 가능하다.

 

 

super() : 부모 생성자

자식 생성자에서 첫 줄에 항상 super()를 통해 부모 생성자를 호출해야 한다.

why? 자식의 생성자는 항상 자신이 선언한 것에 대해서만 초기화해야 한다. 부모 클래스의 인스턴스 멤버는 부모 생성자가 초기화 해야한다.

자식 생성자의 첫 줄에 super()를 써주지 않으면 컴파일러가 자동으로 삽입한다.

 

 

예제 2

- 부모 클래스에서 인스턴스 멤버들을 선언. 선언 역시 새롭게 메소드를 정의하는 것이라 일종의 오버로딩으로 볼 수 있음

- 메소드 이름이 같지만(eat) 매개변수의 개수 또는 타입이 다르기 때문에 가능(오버로딩)

- 자식 클래스는 부모 클래스를 상속받으므로 super()생성자를 적어준다. 생략해도 컴파일이 자동으로 생성하기는 함

- 부모 생성자의 변수를 자식 클래스에서 초기화할 수 없으므로 super()를 이용해 부모에게 넘긴다.

- 부모 클래스의 인스턴스 메소드의 구현부를 수정하는 것이 오버라이딩

- 부모 클래스 객체를 불러와 사용했을 때는 부모 클래스의 메소드들이 사용됨

- 자식 클래스 객체를 불러와 사용하면 부모 클래스에서 상속받은 멤버들과 자식 클래스에서 새로 선언한 메소드들이 사용됨

- 자식 클래스의 기본 생성자에서 super() 생성자로 부모를 받았으므로 "나는 부모 생성자!"가 먼저 출력된 후 "나는 자식 생성자!"가 출력된다.

 

 

실습

 


 

알듯말듯 눈알이 팽글팽글 도는 달거북씨ㅠ

 

728x90

+ Recent posts