본문 바로가기

프로그래밍 독학/코딩 기본 다지기

코딩 기본 다지기 - 5. 추상클래스, 인터페이스, 오버로딩, 오버라이딩, 캐스팅

반응형

코딩 기본 다지기 - 5. 추상클래스, 인터페이스, 오버로딩, 오버라이딩, 캐스팅

 

이 포스팅은 아래 영상을 배우고 정리하는 용도임을 밝힙니다.

 

https://www.youtube.com/watch?v=Ky-CvCQp-qs&list=PLQdnHjXZyYaczbigUDPNeRXeQrdpo5Xwi&index=7

 

 

<추상클래스, 인터페이스>

 

 

 

 

오버로딩(Overloading)

 

하나의 클래스 내에서 이름이 같은 여러 개의 함수를 만들어내는 것

이름은 같지만 패러미터의 자료형이나 개수가 달라서 다른 기능을 가짐

 

 

 

오버로딩이 없다면 위와 같이 addFloat, addDouble 같은 다른 함수명이 필요하다.

 

 

 

 

 

하지만 오버로딩이 있다면 패러미터만 바꿔 같은 이름으로 추가가 가능하다. 

 

 

 

 

 

 

위와 같이 패러미터가 늘어나도 괜찮다. 두 수가 아니라 새로운 패러미터를 추가할 수 있는 것이다.

 

 

 

 

 

 

 

 

 

오버라이딩(Overriding)

 

상속을 받은 서브클래스가 수퍼클래스에서 상속받은 함수 내용을 바꾸고 싶을 때 이용하는 기능이다.

 

 

 

 

수퍼클래스에 있는 함수의 "이름, 패러미터, 자료형"이 같은 함수를 

 

 

 

 

서브클래스에 만들면 서브크래스의 객체는 자신의 함수를 사용하게 된다.

 

 

 

 

 

추상클래스(abstract class)

 

추상?

여러가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출항 파악하는 작용

 

클래스를 만드는 과정 자체를 추상화라고 할 정도로

클래스의 특징과 추상이라는 단어의 정의가 비슷하다.

 

 

 

 

 

일반적인 클래스는 그 클래스 안에서의 함수가 모두 구현돼있는 반면

 

추상클래스는 구현되지 않은 뼈대인 추상함수가 포함된다.

 

추상클래스는 단독으로 사용할 수 없고, 서브클래스에서 상속을 받아 추상함수를 구현해야 한다.

 

 

 

 

 

 

추상클래스를 만들때는 class 앞에 abstract라는 지정어를 넣어 만든다.

 

추상함수 역시 반환형 앞에 abstract를 붙인다.

 

 

그 외 일반함수나 변수는 보통의 클래스와 동일하며 상속과정 또한 동일하다.

 

 

 

 

 

 

 

 

인터페이스(Interface)

변수는 없으며 모든 함수가 추상함수로만 이루어진 상태이다.

 

 

 

따라서 인터페이스 또한 추상클래스처럼 단독을 사용할 수 없다.

 

인터페이스의 모든 함수는 추상함수이므로 abstract는 붙이지 않는다.

 

인터페이스를 받아 클래스를 만들 때는 상속 대신 구현이라는 단어를 사용하는데 

 

인터페이스가 내용이 없는 함수로만 구성되어 상속받을 것이 없기 때문이다.

 

 

 

 

 

인터페이스를 클래스에서 구현할 때는

 

키워드인 implement를 쓰고 인터페이스 이름을 기술하며

 

위와 같이 인터페이스 내의 모든 추상함수의 내용을 구현해주어야 한다.

 

 

 

*클래스는 하나만 상속 가능하지만 인터페이스는 여러개를 받아 구현할 수 있다.

 

*클래스를 상속받더라도 인터페이스는 중복으로 구현 가능하다.

 

 

 

 

 

 

 

 

 

캐스팅(casting)

 

하나의 객체를 호환되는 수퍼클래스나 인터페이스의 객체로 변경해주는 기능

 

 

 

 

이 때, 캐스팅되기 전의 서브클래스에만 존재하는 함수를 더 이상 사용할 수 없게 된다.

 

오버라이딩된 함수도 수퍼클래스의 함수로 변경된다.

 

 

 

 

하지만 추상함수를 서브클래스에서 구현했다면 수퍼클래스로 캐스팅되어도 호출이 가능하다.

 

마치 수퍼클래스의 자체 함수처럼 동작한다는 것이다.

 

 

 

 

 

이해를 돕기 위해 동물 클래스를 만들어보자

 

 

공통적인 기능으로 먹고, 자는 기능을 함수로 넣는다.

 

이동하는 기능을 상속받는 동물들이 별도로 구현할 수 있도록 추상함수로 만든다.

 

 

 

 

 

 

 

이 클래스를 호랑이가 상속받는다면 먹고 자는 것은 동물 클래스에 의존하지만

 

이동하는 것은 스스로 구현하여야 한다.

 

추가적으로 수퍼클래스에는 없지만 울부짖는 함수를 만들어보았다.

 

 

 

 

 

 

 

이 호랑이 클래스에서 객체를 만들어냈다.

이 객체는 먹고, 자고, 이동하고, 울부짖을 수 있다.

 

 

 

 

여기서 호랑이는 동물 클래스를 상속받았기 때문에

아래와 같이 동물객체로 캐스팅해서 사용할 수 있다.

 

 

괄호 안에 캐스팅할 클래스명을 적고 뒤에 객체를 적으면 캐스팅이 완료된다.

 

 

 

 

이 객체는 처음 생성할 때는 호랑이였지만 지금은 동물의 기능만 가능하다.

 

따라서 동물이 자체적으로 구현한 먹고, 자는 것과, 추상함수로 호랑이에서 구현시킨 이동하기만 가능하고

 

호랑이만이 가진 울부짖는 함수는 캐스팅한 후에 쓸 수 없게 된다.

 

 

 

더 기능이 적어지는데 왜 캐스팅을 쓸까?

 

 

 

객체를 사용할 때 호랑이인지 독수리인지 알 수 있을 때도 있지만

 

단지 동물이라는 사실만 알고 동작시켜야 할 때도 있다.

 

이 때, 캐스팅하여 객체를 받게 되면 어떤 동물인지는 몰라도

 

동물의 공통 기능을 사용할 수 있다는 장점이 있기 때문에 캐스팅을 사용하는 것이다.

 

*단, 수퍼클래스로 캐스팅된 객체는 다시 서브클래스로 캐스팅이 불가능하다.

 

 

 

 

 

 

 

 

<정리>

 

공통적인 기능은 수퍼클래스의 일반함수로 구현한다.

 

 

 

서브클래스에서 개별적인 기능을 만들어야 하되, 수퍼클래스에서도 동작시킬 수 있어야 한다면

 

추상함수로 만들어 서브클래스가 구현하게 강제한다.

 

 

 

서브클래스만의 기능은 서브클래스만의 일반함수로 구현하면 된다.

 

 

 

반응형