Basic Java - 상속, 인터페이스, 생성자

bw1611·2023년 2월 22일
0

Java

목록 보기
4/4
  • static, 상속, 다형성
  • Static
    static 변수란 메모리에 고정적으로 할당되어, 프로그램이 종료될 때 해제되는 변수 라고 한다.

https://velog.io/@bw1611/Java%EC%97%90%EC%84%9C-static-%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

  • 상속
public class JavaPractice {
    public static void main(String[] args) {
        검은고양이 a = new 검은고양이();
        a.숨쉬다();
        a.야옹();
        a.뛰어넘다();
        a.미래를_예지하다();

        흰고양이 b = new 흰고양이();
        b.숨쉬다();
        b.야옹();
        b.뛰어넘다();
        b.목숨을_늘리다();
    }
}

class 고양이{
    void 숨쉬다() {}
    void 야옹() {}
    void 뛰어넘다() {}
}

class 검은고양이 extends 고양이{
    /**
     * 고양이 상속을 통해 숨쉬다, 야옹, 뛰어넘다를 선언해주지 않아도 사용할 수 있다.
     */
//    void 숨쉬다() {}
//    void 야옹() {}
//    void 뛰어넘다() {}
    void 미래를_예지하다() {}
}

class 흰고양이 extends 고양이{
//    void 숨쉬다() {}
//    void 야옹() {}
//    void 뛰어넘다() {}
    void 목숨을_늘리다() {}
}

상속을 사용하였을 때의 이점은 코드의 중복을 피할 수 있으며 당연히 코드도 간략해져서 가독성이 좋아지는 것을 볼 수 있다.

  • 다형성

상속, 추상 클래스, 수상 메서드, 인터페이스를 공부하면서 느낀 점은 다 다형성을 위해 만들어진 기능이라 생각된다. 추가로, 객체지향에서의 핵심은 다형성이 아닐까 생각된다.

다형성이란?
"여러 가지 형태를 가질 수 있는 능력"이다. 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 해준다. '조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다'는 것이다.

  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조변수로 자손 타입 객체를 다루는 것
  • 객체와 참조변수의 타입이 일치할 떄와 일치하지 않을 때의 차이?
  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
// Tv parent, SmartTv child
Tv t = new SmartTv(); // ok
SmartTv s = new Tv(); // 에러. 허용 안 됨
  • 매개변수의 다형성

    장점

    1. 다형적 매개변수

    2. 여러 종류의 객체를 배열로 다루기

    다형적 매개변수

  • 참조형 매개변수는 메세드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 념겨줄 수 있다.

class Buyer {
  int money = 1000;
  int bonusPoint = 0;

  void buy (Product p) {
    money -= p.price;
    bonusPoint += p.bonusPoint;
  }
}

// Product가 아니면
// class Tv extends Product {}
void buy (Tv tv)) {
  money -= tv.price;
  bonusPoint += tv.bonusPoint;
}
// 이런식으로 하나하나 다 만들어야한다.
// 이게 매개변수의 다형성의 1번 장점이다.

여러 종류의 객체를 배열로 다루기

  • 조상타입의 배열에 자손들의 객체를 담을 수 있다.
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
class Buyer {
  int money = 1000;
  int bonusPoint = 0;

  Product[] cart = new Product[10]; //구입한 물건을 담을 배열
  int i = 0; //장바구니 인덱스

  void buy (Product p) {
    money -= p.price;
    bonusPoint += p.bonusPoint;
    cart[i++] = p; //카트에 저장하고 i는 1증가
  }
}

인터페이스를 이용한 다형성

  • 인터페이스도 구현 클래스의 부모이다
  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
interface Fightable {
  void move(int x, int y);
  void attack(Fightable f); // 상속받아 구현한 클래스의 인스턴스만 가능
}

class Fighter extends Unit implements Figtable {
  public void move(int x, int y) { ... }
  public void attack(Fightable f) { ... }
}

조상클래스 -> 자손객체
Unit u = new Fighter();      // 가능
Fightable f = new Fighter(); // 가능
  • 생성자, 예외처리
  • 생성자
    자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공합니다.
    자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 합니다.
    즉, Car 클래스의 생성자의 이름은 Car가 됩니다.

이러한 생성자는 다음과 같은 특징을 가집니다.

  • 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않습니다.

  • 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.

  • 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있습니다.

  • 클래스명과 메서드명이 동일하다.

    즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다는 의미입니다.

public class ThisIsJava {
    public static void main(String[] args) {
        전사 a전사 = new 전사("김질두"); // new 전사() 로 생성하게 되면 홍길동이 나온다.

        System.out.println(a전사.이름);
        System.out.println(a전사.나이);
    }
}

class 전사 {
    String 이름;
    int 나이;

	// 오버로딩
    전사(){
        이름 = "홍긷롱";
        나이 = 20;
    }

    전사(String 이름){
        this.이름 = 이름;
        나이 = 15;
    }
}
    public static void main(String[] args) {
        전사 a전사 = new 홍길동();
        a전사.a무기 = new();

        a전사.공격();
        // 출력 => 홍길동이(가) 활(으)로 공격합니다.

        a전사 = new 홍길순();

        a전사.공격();
        // 출력 => 홍길순이(가) 칼(으)로 공격합니다.

        a전사.a무기 = new();
        a전사.공격();
        // 출력 => 홍길순이(가) 창(으)로 공격합니다.
    }
}

abstract class 전사 {
    String 이름;
    무기 a무기;

    public void 공격() {
        a무기.작동(이름);
    }
}

class 홍길동 extends 전사 {
    홍길동() {
        이름 = "홍길동";
    }
}

class 홍길순 extends 전사 {
    홍길순() {
        이름 = "홍길순";
        a무기 = new();
    }
}

abstract class 무기 {
    String 무기명;
    void 작동(String 사용자명) {
        System.out.println(사용자명 + "(이)가 " + 무기명 + "(으)로 공격합니다.");
    }
}

classextends 무기 {() {
        무기명 = "활";
    }
}

classextends 무기 {() {
        무기명 = "창";
    }
}

classextends 무기 {() {
        무기명 = "칼";
    }
}
  • 예외처리
class Main {
    public static void main(String[] args) {
        int[] datas = new int[2];
        
        try {
            work(datas);
        }
        catch ( IllegalArgumentException e ) {
            System.out.println("하하");
        }
    }
    
    static void work(int[] datas) {
        if ( datas.length < 3 ) {
            throw new IllegalArgumentException(); // 함수가 여기서 멈춤
        }
        
        datas[0] = 10;
        datas[1] = 20;
        datas[2] = 30;
    }
}

자바에서 기본적으로 예외처리를 제공하지만 모든 사용자를 만족시킬 수 없다. 그래서 커스텀으로 예외처리를 할 수 있는데 아래 내용이 바로 커스텀으로 예외처리를 한 것이다.

class Main {
    public static void main(String[] args) {
        int[] datas = new int[2];
        
        try {
            work(datas);
        }
        catch ( 입력된_배열의_사이즈가_3보다_작은_Exception e ) { // 코드 가독성이 v2 보다 좋음
            System.out.println("하하");
        }
    }
    
    static void work(int[] datas) {
        if ( datas.length < 3 ) {
            throw new 입력된_배열의_사이즈가_3보다_작은_Exception(); // 함수가 여기서 멈춤
        }
        
        datas[0] = 10;
        datas[1] = 20;
        datas[2] = 30;
    }
}

class 입력된_배열의_사이즈가_3보다_작은_Exception extends RuntimeException { 
	// 예외처리 내용
}
profile
Java BackEnd Developer

0개의 댓글