ssung_항해일지/항해99_언어학습(Java)

Java - 4일차

ssungcohol 2023. 1. 26. 00:36

객체지향 Part.2

상속

  • 기존의 클래스로 새로운 클래스를 작성하는 것
  • 두 클래스를 부모, 자식 관계를 맺는 것
  • extens 키워드를 사용
class Parent {}
class Child extends Parent {}

상속의 조건

  • 자손(Child)는 조상(Parent)의 모든 멤버를 상속받는다
     - 생성자 와 초기화 블럭 은 제외
  • 자손의 멤버 개수는 조상보다 적을 수 없다.
     - 항상 같거나 많음
  • 자손의 변경은 조상에게 영향을 미치지 않음

포함관계

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이를 조합해서 클래스를 만드는 것
class Engine {}
class Door {}
class Car{}
	Engine engine = new Engine ();
    	Door [] doors = new Door[4];  // 문 4개, Door 클래스 하나로 문 4개 생성

관계 결정

  • 상속관계 : ~은 ~이다. (is - a)
  • 포함관계 : ~은 ~을 가지고 있다. (has - a)

단일상속

  • Java는 단일 상속만을 허용한다.
     - 비중이 높은 클래스 하나만 상속관계로 하고 나머지는 포함관계를 사용하여 풀어낼 수 있다.

오버라이딩

  • 상속받은 조상의 메서드를 자식 자신에게 맞게 변경하는 것
     - 선언부는 변경 불가능
     - 메서드 내부 내용만 변경 가능

오버라이딩 조건

  • 선언부가 조상 클래스의 메서드와 일치해야한다.
  • 접근 제어자를 조상 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

오버로딩 & 오버라이딩

  • 오버로딩 = 기존에 없는 새로운 메서드를 정의
  • 오버라이딩 = 상속받은 메서드의 내용을 변경

super

  • 객체 자신을 가리키는 참조변수
  • 인스턴스 메서드 (생성자) 내에서만 존재
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용
  • 부모의 것이 super!!

super()

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화를 한다
  • 생성자의 첫 줄에 반드시 생성자를 호출해야한다!
     - 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 자동으로 삽입
class Parent {
	int x, y, z;
    
    public Parent() {
    	System.out.println("난 부모 클래스 생성자");
    }
    
    public Parent(int x, int y, int z) {
    	this.x = x;
        this.y = y;
        this.z = z;
    }
}

class Child extends Parent {
	Child () {
    	super(10, 20, 30);  // super() 를 사용해 부모클래스 멤버변수 초기화
    }
}

package

  • 서로 관련된 클래스의 묶음
  • package = 하나의 폴더
  • 클래스의 실제 이름은 패키지를 포함 (java.lang.String)

package 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번만 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속한다.
  • 패키지 선언이 없으면  default 패키지에 속하게 된다.

클래스 패스 (classpath)

  • 클래스 파일 (.class)의 위치를 알려주는 경로
  • classpath(환경변수)로 관리하며 경로간의 구분자는 ' ; ' 를 사용
  • classpath에 패키지의 루트를 등록해줘야 한다.

import

  • 클래스 사용 시 패키지의 이름을 생략 가능하게 해준다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.
  • java.lang 패키지는 중요한 클래스들이 모여있는 패키지로 import를 생략할 수 있다.
    (String, Object, System....)
  • 선언 방법 : import 패키지명.클래스명;
  • import는 패키지와 클래스 선언 사이에 존재.

static import

  • static 멤버를 사용할 때 이름을 생략 가능하게 해준다.
     - import static java.lang.System.out;
     - 위 처럼 선언해주면 out.println("출력!"); 이렇게 사용 가능

접근 제어자

 

제어자

  • 클래스와 클래스 멤버(변수, 메서드) 에 부가적인 의미를 부여
     - 접근 제어자 : public, protected, (default), private
     - 그 외 : static, final, abstract ....
  • 하나의 대상에 여러 제어자를 같이 사용 가능 (접근 제어자는 하나만)
     - 순서는 상관없지만 주로 접근 제어자를 제일 왼쪽에 선언
     - public static void main(String[] args) {}

static

  • 멤버변수, 메서드, 초기화 블럭에 static이 사용될 수 있다.
제어자 대상 의미
static 멤버변수  - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
 - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
 - 클래스가 메모리에 로드될 때 생성
메서드  - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
 - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

final

  • 클래스, 메서드, 멤버변수, 지역변수에 final 이 사용될 수 있다.
제어자 대상 의미
final 클래스  - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
 - final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
 - Ex) String, Math
메서드  - 변경될 수 없는 메서드
 - final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수  - 변수 앞에 fianl이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수
  • 생성자를 이용하여 final 멤버변수를 초기화 할 수 있다.
     - final 이 붙은 변수는 상수이기 때문에 보통은 선언과 동시에 초기화를 진행해야 하지만, 인스턴스 변수의 경우 생성자에 의해서 초기화 할 수 있다.

abstract

  • 클래스, 메서드에 abstract 이 사용될 수 있다.
제어자 대상 의미
abstract 클래스  - 클래스 내에 추상메서드가 선언되어 있음을 의미한다.
메서드  - 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.
abstract clss AbstractTEST {  // 미완성 클래스이다. 따라서 당연히 객체 생성 불가능
	abstract void abstractMethod();  // 구현부가 없는 메서드
}​

접근 제어자

  • private : 같은 클래스 내에서만 접근이 가능
  • (default) : 같은 패키지 내에서만 접근이 가능 (생략가능)
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
  • public : 접근 제한이 전혀 없음

 


캡슐화 - 접근 제어자를 사용하는 이유?

  • 외부로부터 데이터를 보호하기 위해서 사용
  • 내부적으로만 사용되는 것을 외부로 노출시키지 않고 감추기 위해 사용
  • 캡슐화 = 데이터 보호

다형성 - 여러 가지 형태를 가질 수 있는 능력, 조상의 '타입 참조변수로' 자손의 타입 객체를 다루는 것이다

  • 조상의 타입 참조변수로 자손의 타입 객체를 다룰 수 있다.
  • 하지만 조상 타입에는 없는, 자손 타입만 가지고 있는 기능 및 속성들은 사용할 수 없다.

참조변수의 형변환

  • 사용할 수 있는 멤버의 개수를 조절하는 것
  • 조상, 자손 관계의 참조변수는 서로 형변환이 가능

A(객체) instanceof B(클래스) 연산자

  • A 객체가 B 클래스로부터 상속을 받았는지 확인 가능
  • 참조변수를 형변환 하기전에 형변환 가능여부를 파악하기 위해 사용
  • 형변환 전에 반드시 instanceof로 확인!

오늘은 이정도에서 나의 뇌는 멈추었다...

뇌가 멈추는 대신 나의 방향성을 알아버렸다.

U턴해서 다시 시작..해야될 것 같으요...

페이스를 잃고 따라가기 급급했었는데, 다시 페이스를 찾아야 하느니라..

조금 늦더라도 천천히 할 수 있돠아~~

 

기술 매니저님들께서는 스트레스 받지말고 이해할 정도로만 공부를 하고 넘어가라고 하셨는데..

어떻게 그게 되는겁니까 매니저님들... 당시에는 이해가 되더라도 문제, 예제를 보면 머리가 깨끗해지더라구요..

다들 이런 시행착오를 겪으셨나요?? 아니면 저만 이런건가요?? 

 

오늘은.. 정인 - 오르막길 을 듣고 자봐야겠습니다...

 

웃음기 사라질거야아~~

728x90