열혈 Java 13 - 상속과 생성자, 그리고 static

whipbaek·2021년 12월 27일
0

열혈Java

목록 보기
13/18
  • 상속의 매우 치명적인 오해
    코드의 재활용을 위한 문법입니다 . (X)
    연관된 일련의 클래스들에 대해 공통적인 규약을 정의할 수 있습니다.(O)

    -> 서로 다른 클래스를 상속으로 묶으면 일련의 규약을 공통적으로 적용시킬 수 있다.

    Code Level에서의 상속의 예

class Man{
	String name;
	public void tellyourname() {
		System.out.println("My name is " + name);
	}
}

class BusinessMan extends Man { //extends <- 상속을 의미
	String company;
	String position;
	public void tellyourInfo() {
		System.out.println("My company is " + company);
		System.out.println("My position is " + position);
		tellyourname(); //상속하는 클래스의 함수 사용
	}
}
  • BusinessMan 은 Man 클래스를 상속한다.
  • 상속을 할시, BusinessMan의 인스턴스 안에 Man 클래스의 정보가 담겨있다.
  • 단, 상속하더라도 private로 선언되어 있다면, 인스턴스안에는 존재하지만 접근은 불가능하다.

상속과 생성자

  • 위 코드에서 문제가 되는 부분은 무엇일까?
    : 위에서 설명했듯이 BusinessMan 인스턴스 내에는 Man 클래스의 정보가 들어가 있다. 그러나 인스턴스를 만들때 Man의 생성자까지는 책임져주고 있지 않다.

  • 개선
    : BusinessMan 클래스에서 Man의 변수까지 초기화해주는 생성자를 만들었다.
    허나 이러한 방식은 좋지않다, 각 클래스의 변수들은 각 클래스의 생성자를 통하여 초기화 해주는게 좋다.
    그게 원칙이고, 그것이 일관되게 지켜졌을때 좋은 코드라고 할 수 있기 때문이다.

그러면 어떻게 해결해야 할까 ?

상속과 생성자 호출 관계 파악하기

  • 사진에서 보면 SubCLS(하위 클래스)의 인스턴스를 생성하는데 상위 클래스의 생성자가 호출되고, 하위클래스의 생성자가 호출 되었다.

    -> 하위 클래스에서는 인스턴스 생성시 상위 클래스의 생성자를 "무조건" 호출해야 한다, 그리고 위처럼 따로 명시가 안되어있을경우 인자를 받지않는 상위클래스의 생성자가 호출된다.

  • 상위 클래스가 먼저 생성 된 후 -> 하위 클래스가 생성되는 과정을 인지해야한다.

    super();

  • 상위 클래스의 생성자를 부를때 사용하는 문법이다.

  • 오버로딩 되어있는 생성자를 상황에 따라 부를 수 있다.

  • 따로 명시가 되어있지 않다면 인자를 받지않는 상위클래스의 생성자를 호출한다.

    최종본

  • 기존의 코드를 최종적으로 위와 같이 변경할 수 있다.

  • 가장 default한 class의 정의임과 동시에 근본이 되는, 중요한 form이다.

    상속을 위한 두 클래스의 관계

  • Java에서는 문법으로 클래스와의 연관관계를 떠나서 상속 할 수 있다.

  • 예로, 노트북 클래스가 지우개 클래스를 상속할 수 있다. 이 뜻은 노트북은 지우개 클래스의 기능을 가진다는 뜻이며, 노트북으로 무언가를 지울 수 있다는 뜻이다.

  • Java는 현실세계를 기반으로 만들어진 언어라고도 한다, 그렇기 때문에 문법허용적이 아닌 현실세계를 기반으로 사실관계를 기반으로 코딩하는것이 자연스럽다.

  • 위의 예시로 보면 스마트폰은 모바일폰을 상속한다.
    문법적으로 생각해보면 스마트폰 클래스는 모바일폰 클래스의 변수와 메서드를 가지고 있는것이다. -> 하위 클래스는 상위 클래스의 모든 특성을 지닌다는 뜻이다.

  • 스마트폰은 모바일폰의 일종이다. 이런 관계를 IS-A관계라고 부르며, 상속관계는 IS-A 관계를 가져야만 한다.
    (ex> 스마트폰은 모바일폰이다, 사과는 과일이다 ...)

  • 만약 IS-A 관계가 아닌 상속관계가 있다면 잘못된 상속관계이다.

    static 과 상속


  • static 변수 , static 메소드 ( = 클래스 변수, 클래스 메소드) 는 상속이 되지 않는다.

  • 프로그램 전역에 걸쳐 단 하나만 존재할 뿐더러, 다른 데이터 공간에 존재하기 때문이다.

  • 단, 앞서 static의 기본개념을 다뤘을때 얘기하였듯이, static이 선언된 클래스 내에서는 직접접근이 가능하다, 상속이 되었을때 이 권한은 상속이 된다.

  • SuperCLS 클래스에서 따로 클래스명.count처럼 접근하지 않고 바로 count 를 사용할 수 있는 이유가 바로 그것이다.

    출처 : 윤성우의 열혈Java 프로그래밍

profile
코딩 및 CS에 관하여 공부합니다.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN