본문 바로가기

준비중

자바 복습하기(extends, super, abstract, interface편)

반응형

* 해당 게시물은 자바의 정석(책)을 참고하여 작성하였습니다.

 

상속

상속이란 기존의 class를 재사용하여 새로운 class를 작성하는 것으로 extends를 붙여서 사용한다.

ex)

class Child extends Parent {
// Child, parent를 확장한
}

parent - 조상 class로 super class

child - 하위 class

 

사용시 주의사항

1. 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.

2. 자손 class의 member 개수는 조상 class보다 항상 같거나 많다.

 

 

Object class

object class는 모든 class의 상속계층도의 최상위에 있는 조상class이다.

class Member extends Object {
//pass
}

이렇게 하면 Object class가 된 Member class가 모든 class의 super class가 된다.

 

 

overriding

overriding이란 조상 클래스로부터 상속받은 method의 내용을 변경하는 것을 overriding이라고 한다.

class Point {
    int x;
    int y;

    String getPoint(){
        return "x:" + x + ", y: "+y;
    }
}
class Point3D extends Point {
    int z;

    String getPoint(){
        return "x:" + x + ", y: "+ y + ", z :" + z;
    }

}

 

overriding의 조건

자손 클래스에서 overriding하는 method는 조상 클래스의 method와

이름 , parameter , return값이 같아야 한다.

 

* overloading과 overriding의 경우 이름이 비슷하여 처음 배우는 사람들은 헷갈릴 수 있다.

overloading - 기존에 없는 새로운 method를 정의하는 것(new)

overriding -  상속받은 method의 내용을 변경하는 것(modify) 

 

super

x라는 variable이 Parent class와 parent를 extend한 Child class에 각각 정의되어 있다.

child에서 x를 사용할 때

this.x 를 이용하면 child(본인)에 선언된 member variable을 뜻하고

super.x를 이용하면 조상 class인 parent에 선언된 member variable을 뜻한다.

 

즉, super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.

 

super()

this()와 super()는 생성자이다.

this() - 같은 클래스의 다른 생성자를 호출

super() - 조상클래스의 생성자를 호출

 

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super()를 호출해야한다.

그렇지 않으면 compiler가 자동적으로 super()를 생성자의 첫줄에 삽입한다.

 

제어자

static

제어자 static의 경우 instance member를 사용하지 않는 method는 static을 붙여서 static method로 사용하는 것이 좋다.

 

final

1. 변수에 사용하면 상수가 된다.

2. method에 사용하면 overriding을 할 수 없게 된다.

3. class에 사용하면 extend를 할 수 없게 된다.

 

접근 제어자

private - 같은 class 안에서만 접근이 가능하다.

default - 같은 package 안에서만 접근이 가능하다.

protected - 같은 package 안과 다른 package의 자손 class에서 접근이 가능하다.

public - 접근 제한이 없다.

 

* 범위의 크기

public > protected > default > pricate

 

접근 제어자를 사용하는 이유는

외부로 부터 데이터를 보호하고 외부에 불필요하고 내부적으로만 사용되는 부분을 감추기 위해 사용된다.

 

해당 예시를 사용하여 설명해보겠다.

public class Time{
    private int hour;
    public int getHour(){
        return hour;
    }
    public void setHour(int hour) {
        if (hour < 0 || hour > 23) return;
            this.hour = hour;
    }
}

hour을 private으로 설정한 이유는 hour에 잘못된 값을 저장하거나 다른 목적으로 이용하는 것을 막기 위해서이다.

그리고 이 private으로 설정한 hour을 사용하기 위해 public method를 제공하여 간접적으로 다룰 수 있게 한다.

public으로 제공한 method에는 get과 set이 있는데 이는 spring에서도 많이 사용하며 흔히 getter, setter로 사용한다.

이들은 보통 member variable을 다룰 때 설정하는 method이다.

 

생성자와 접근 제어자

생성자의 접근 제어자를 private으로 지정하면 클래스 내부에서만 인스턴스를 생성할 수 있고, 외부에서는 생성자에 접근 할 수도 없고

instance를 생성할 수도 없다.

허나 public이고 static인 method를 제공하여 외부에서 이 클래스의 instance를 사용할 수 있게 한다.

class Singleton {
    private static Singleton s = new Singleton(); //getInstance가 static으로 지정되어 있으므로
    private Singleton(){

    }
    public static Singleton getInstance(){ //instance를 생성하지 않고도 호출하므로 static으로 지정
        return s;
     }
}

*생성자가 private이라면 다른 클래스의 조상이 될 수 없다.

 

정리하자면 

생성자에 private를 붙여 외부로부터 독립시킨다.

이에 대한 조건은 추후에 이를 다룰 method의 경우 public인 동시에 static이어야 한다.

static으로 된 method는 nstance와 static의 생성 조건에 맞춰 생각해보면 static으로 된 생성자만이 다룰 수 있다.

 

* 접근 제어자가 private인 method는 overriding이 될 수 없기 때문에 method에 private와 final을 같이 사용할 필요는 없다.

* 클래스 앞에 final을 추가하면 상속 할 수 없는 class라는 것을 알릴 수 있다.

 

abstract class

추상 클래스라고 불리는 abstract class는 그 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.

 

* abstract class는 선언부만 작성하고 구현부는 작성하지 않는다.

그 이유는 method의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문이다.

따라서 abstract class를 상속받는 자손 클래스는 조상의 method를 상황에 맞게 적절히 구현해줘야 한다.

 

* 편하게 추상 클래스의 작성이유는 공통된 부분을 뽑아서 코드의 추상화와 구체화를 이루기 위해서이다.

 

interface

interface는 일종의 abstact class로 

abstract class를 부분적으로만 완성된 미완성 설계도라고 한다면, interface는 밑그림만 그려진 기본 설계도라고 할 수 있다.

다른 관점에서 설명하자면 클래스에는 사용하는 쪽과 제공하는 쪽이 있는데,

method를 사용하는 쪽에서는 사용하려는 method의 선언부만 알면 된다. 따라서 interface라는 설계도를 통해 선언부만 알게 도와주는 것이다.

 

interface 주의 사항

1. 모든 멤버변수는 public static final이어야 하며, 이를 생략할 수 없다.

2. 모든 method는 public abstact 이어야 하며, 이를 생략할 수 있다.

 

 

* interface를 구현할 때는 spring 게시물에서도 쓴 코드들 처럼 implements를 이용한다.

또한 implements를 이용하여 구현 할 때 abstact와 extends를 같이 사용할 수 있다.

 

interface의 장점

1. 개발시간을 단축시킬 수 있다.

2. 표준화가 가능하다.

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.

 

 

반응형