본문 바로가기
JAVA

JAVA(상속성, 다형성)

by 글로리. 2020. 6. 9.

상속성

클래스 간의 상속?

  • 클래스간에는 부모 - 자식의 상속 관계를 설정 가능.
  • 부모클래스A를 자식클래스B가 상속 받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속 받음.
    (단, private으로 설정된 기능은 상속X)
  • B는 A의 public, protected 기능들을 직접적으로 코딩하지 않더라고 자신의 것으로 사용가능.
  • 두명의 부모에게 상속받는것은 불가능, 한 부모가 여러명의 자식에게 상속가능.

상속 정의 방법

  • 'extends'를 입력하여 부모클래스의 이름 명시
public class 자식클래스 extends 부모클래스 {
            명  령  어
}

* 부모클래스 작성

public class CalcParent {
    public int plus(int x, int y) {
        return x+y;
    }
    public minus(int x, int y) {
        return x-y;
    }
}

* 자식클래스 작성

부모의 기능 상속 후 곱셈과 나눗셈 추가.

public class CalcChild extends CalcParent {
    public int times(int x, int y) {return x*y;}

    public int divide(int x, int y) {
        int result = 0;
        if (y != 0) {
            result = x / y;
        }
        return result;
    }
}

* CalcParent와 CalcChild의 활용

public class Main01 {
    public static void main(String[] args) {
        CaIcParent parent = new CalcParent();
        system.out.println(parent.plus(l00, 50));
        system.out.println(parent.minus(l00, 50));

        System. println("-------------");

        CalcChild child = new CaIcChild();
        System.out.println(child.plus(200, 100));
        System.out.println(child.minus(200, 100));
        System.out.println(child.times(200, 100));
        System.out.println(chi1d.divide(200, 100));
    }
}

// 실행결과
150
50
-------------
300
100
20000
2

다형성

다형성을 구현하기 위한 Override

Override: 부모로부터 상속받은 메서드를 재정의 하는것

class Hello {
    public void say() {
        System.out.println("Hello");
    }
}
class English extends Hello {

}
class Korean extends Hello {
    public void say() {
        system.out.println("안녕하세요.");
    }
}
    public class Foo {
    public static void main(String[] args) {
        English e = new English();
        e.say();

        Korean k = new Korean();
        k.say();
    }
}
// 실행결과
Hello
안녕하세요
  • 위 소스코드에서 'e.say();'"Hello" 를 찾아가고, 'k.say();'"안녕하세요" 를 찾아간다.

Super 키워드

  • 클래스의 상속관계에서 자식클래스가 부모클래스를 가리키는 예약어
  • 사용방법
    • 멤버변수 이름 앞에 명시
      • 부모클래스의 멤버변수를 의미.
      • 하지만 부모클래스의 멤버변수는 이미 모두 상속되어 있으므로 이 경우에는 this키워드를 사용한것과 동일한 결과이기에 잘사용하지 않음.
    • 메서드 이름 앞에 명시
      • 부모클래스의 메서드 의미
      • 재정의 되지 않은 메서드 -> 이미 상속되어 있으므로 this키워드를 사용한것과 동일한 결과
      • 재정의 된 메서드 -> Override된 메서드이름 앞에 사용하게되면 재정의되기 이전의 원본 메서드 의미.
    • 키워드 자체를 메서드처럼 사용
      • 부모클래스의 생성자 의미.

Super 키워드 사용예제

class Hello {
    public void say() {
        System.out.println("Hello");
    }
}

class Korean extends Hello {
    public void say() {
        super.say();
        System.out.println("안녕하세요");
    }
}

public class Foo {
    public static void main(String[] args) {
        Korean k = new Korean();
        k.say();
    }
}

// 실행결과
Hello
안녕하세요
  • 위 소스코드에서 'super.say();' 를 통해서 맨위 부모클래스(Hello)의 say()에 접근하여 "Hello" 호출.

Override 옵션

1. 메서드 재정의 과정에서 오타가 발생해도 인정된다.

  • 부모클래스의 say()메서드를 재정의 하는 과정에서 실수로 인해 'sai()' 라고 메서드를 추가 했다면
    java는 새로운 메서드를 추가했다고 인식하고 에러를 표시하지 않음
class Hello {
    public void say() {
        System.out.println("Hello");
    }
}

class Korean extends Hello {
    // 오타발생
    public void sai() { 
        System.out.println("안녕하세요");
    }
}

public class Hi {
    public static void main(String[] args) {
        Korean k = new Korean();
        k.sai();
    }    
}

// 실행결과
안녕하세요

2. 메서드 재정의 과정에서의 오타 방지 옵션

  • '@Override' 는 이 키워드가 명시된 위치 아래에 정의되는 메서드가
    부모클래스에 존재하지 않을 경우 구문에러로 처리.
  • 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다.
class Hello {
    public void say() {
        System.out.println("Hello");
    }
}

class Korean extends Hello {
    // @Override 입력
    @Override
    public void sai() { 
        System.out.println("안녕하세요");
    }
}

public class Hi {
    public static void main(String[] args) {
        Korean k = new Korean();
        k.sai();
    }    
}

// 실행결과
< 에러 발생 >

Overload 옵션

  • 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만,
    이를 가능하게 하는 예외적인 처리기법.
  • 이름이 동일한 메서드를 정의하기 위한 조건
// 메서드간의 파라미터가 서로 달라야 한다.
public void foo(int a) { }
public void foo(long a) { }

// 파라미터의 갯수가 달라야 한다.
public void foo(int a) { ]
public void foo(int a, int b) { }

// 데이터 형의 전달 순서가 서로 달라야 한다.
public void foo(int a, long b) { }
public void foo(long a, int b) { }

객체 생성방법의 다양화

  • 생성자 역시 메서드의 한 종류이므로 Overload 가능.
  • 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체 생성방법' 을 다양하게 할 수 있다.
public class Member{
    private String job;
    private int age;

    public Member(){ }

    public Member(int age){
        this.age = age;
    }

    public Member(String job){
        this.job = job;
    }

    public Member(String job, int age){
        this.job = job;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member [job=" + job + ", age=" + age + "]";
    }
}

'this' 키워드를 사용한 생성자 Overload

  • this 키워드의 용법
    • 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자 의미
  • this 키워드를 사용하여 생성자 Overload를 간결하게 처리
    • 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록하여 데이터의 초기화를 한곳에서 처리하도록 구현.
  • 생성자 정의하기
public class Article{
    private int seq;
    private String subject;
    private String writer;

    public Article(int seq, String subject, String writer){
        super();
        this.seq = seq;
        this.subject = subject;
        this.writer = writer;
    }

    public Article(int seq){
        this(seq, "제목 없음", "익명");
    }

    public Article(int seq, String subject){
        this(seq, subject, "익명");
    }

    @Override
    public String toString() {
        return "Article [seq=" + seq + ", subject=" + subject + ", writer=" + writer + "]";
    }
}



  • 생성한 Article 클래스의 기능 확인
public class Main03
{
    public static void main(String[] args) {
        Article a1 = new Article(1);
        System.out.println(a1.toString());

        Article a2 = new Article(2, "테스트 게시물");
        System.out.println(a2.toString());

        Article a3 = new Article(3, "두 번째 게시물", "자바학생");
        System.out.println(a3.toString());
    }
}

// 실행결과
Article [seq=1, subject=제목 없음, writer=익명]
Article [seq=2, subject=테스트 게시물, writer=익명]
Article [seq=3, subject=두 번째 게시물, writer=자바학생]

'JAVA' 카테고리의 다른 글

JAVA(추상화, 인터페이스)  (0) 2020.06.10
JAVA(객체형변환, 객체배열)  (0) 2020.06.10
JAVA(자바빈즈(Java Beans), 은닉성, 상속성)  (0) 2020.06.09
JAVA(클래스, 객체, 생성자)  (0) 2020.06.04
JAVA(재귀함수)  (0) 2020.06.04

댓글