본문 바로가기

TIL

[ 11월 14일 Today I Learned ] Java 클래스, 상속, 다형성

오늘은 Java 의 객체지향적 요소들을 배웠다.

 

클래스란 설계도나 붕어빵 틀에 비유할 수 있다.

 

어떤 변수, 그리고 그 변수를 다루는 메소드들을 한 데에 모아서 정의해놓은 것이라 생각할 수 있다.

 

class Animal{
    String name;
    String color;

    public Animal(String name) {
        this.name = name;
    }

    public void cry(){
        System.out.println(name+ " is crying.");
    }
}

실세계에 존재하는 동물의 특징을 반영해서 만들어낸 Animal 이란 클래스이다.

 

이 클래스는 '이름'과 '색깔'을 자신의 특징으로 하는 데이터로 가지고 다니고

 

동물의 행동을 나타내는 or 동물이 가진 데이터를 다루는 메소드들을 그 안에 정의한다.

 

예를 들어, 동물이 울 때. 어떻게 동작할 지 class 안에서 미리 정의 = 설계 해놓는다.

 

 

[ 생성자 ]

 

저 위의 class를 가만 보면

 

특이하게, class의 이름과 동일한 이름의 메소드가 있다.

 

또다른 특징으로, 이 메소드는 return 값이 없다.

 

이러한 메소드를 '생성자'라고 한다.

 

클래스의 설계를 따라 만드는 물체를 '객체'라고 하는데

( new 연산을 통해 Reference Type. 변수는 생성된 객체의 주소값을 가진다.

주소값을 이용해서 객체의 data와 method 에 접근한다 )

 

new 연산을 통해 객체가 생성될 때, 이뤄지는 작업들을 정의해놓은 것이 생성자이다.

 

 

[ Overloading ]

 

동일한 클래스 내에 메소드

 

내 기억에 C++에서는 클래스가 아니더라도, 그냥 함수

 

이렇게 통칭 '함수'들의 이름을 동일하게 설정하고

 

1) input 값의 개수가 다르거나

 

2) input 값의 Type이 다르게 해서

 

똑같은 이름의 함수를 불러도, 1) 과 2) 조건에 따라 다르게 함수를 호출하는 것을 의미한다.

 

결국 동일한 이름의 메소드들은, 근본적으로 같은 기능을 하는 메서드 들이지만.

 

서로 다른 이름을 가져야하기 때문에, 메소드를 작성하는 쪽에서는 이름을 짓기도 애매하고

 

메소드를 사용하는 쪽에서는 이름을 일일히 구분해서 기억해야하기 때문에, 부담이 되는데

 

이 방법을 통해 좀 더 편리하게 코딩할 수 있다.

 

 

[ 클래스의 상속 ]

 

class Dog extends Animal {

    public Dog(String name) {
        super(name);
    }

    @Override
    public void cry(){
        System.out.println(name+ " is barking.");
    }
}

Java에서는 extends 키워드를 통해서

 

하위 클래스가 상위 클래스의 변수와 메소드들을 받을 수가 있다.

 

하위 클래스에서, 상위(super) 클래스의 메소드를 다시 재정의 할 수 있는데

 

그것을 Method Overriding 이라 한다.

 

상속을 통해, 기존 클래스보다 더 구체적이고 더 나은 클래스를 만들어낼 수 있다.

 

이미 작성된 코드를 기반으로, 구성된 틀을 사용해 빠르게 개발할 수 있기에

 

코드의 재사용성이 좋고, 더 빠르고 검증된 개발을 할 수 있게 해준다.

 

 

[ Reference Type & Pointer / Polymorphism ]

 

부모 클래스에서 상속을 받아서 만든 자식 클래스를

 

부모 클래스로 가리킬 수 있다.

 

자식 클래스는 부모 클래스의 확장판이나 다름없으므로,

 

부모 클래스에 없는 method 들이 존재할 수 있다.

 

하지만, 메소드는 Runtime에서 동적으로 바인딩 되는데,

 

이를 이용해서, 자식 클래스에 있는 메소드 중 부모 클래스에 이미 정의된 메소드를 호출할 수 있는데

 

이 때, 자식 클래스의 메소드가 부모 클래스의 기존 메소드를 Override 한 상태라면

 

자식 클래스의 method로 호출된다. 이를 이용해서, 한가지 타입으로 다양한 타입을 가리킬 수 있다.

 

객체지향의 다형성을 상속과 override 를 통해 구현할 수 있는 것이다.