0418 자바 8일차 🍕 형 변환

다 은·2024년 4월 19일

JAVA

목록 보기
10/14

👽 '무기 a무기 = new 칼();' 의 실행 과정

public class Main{
	public static void main(String[] args) {
    	무기 a무기 = new();
        // 오직 객체만 살 수 있는 메모리구역(힙)에 칼 클래스를 사용해서 객체 생성
        // 객체는 내부에 자기 자신을 조종할 수 있는 this 리모콘을 가지고 태어남
        // 현재 이 상태는 오직 칼 객체만이 자신을 조종할 수 있는 상태임

        // 무기 클래스의 메소드를 사용할 수 있는 리모콘을 가지는 a무기 변수가 생성됨
        // 칼 클래스는 a무기에 들어가고 싶지만 이미 무기 클래스에 있기 때문에 불가능함
        // 때문에 칼 클래스는 자신의 리모콘을 포기하고 무기 클래스의 상속을 받아 a무기 객체를 가질 수 있음

        a무기.공격(); // 정상 동작
        a무기.방어(); // 에러
        // 위처럼 a무기가 공격 메소드를 사용하면 무기 클래스 안에 있으며 또한 상속받은 칼 클래스
        // 안에도 존재하기 때문에 사용 사능하지만,
        // 칼 클래스 안에만 존재하는 방어 메소드는 칼 클래스에 리모콘이 없기 때문에 사용할 수 없음
    }
}

class 무기 {
    public void 공격() {
    }
}

classextends 무기 {
    void 방어(){

    }
}

👽 매개변수 사용해서 매번 다르게 공격하는 프로그램

class Main{
    public static void main(String[] args) {
        전사 전사 = new 전사();

        전사.공격("브라이언", "칼");
        전사.공격("필립","활");
        전사.공격("마크","창");
		// 브라이언, 칼, 필립, 활, 마크, 창은 공격 메소드의 인자
    }
}
class 전사{
    void 공격(String 이름, String 무기){
    	// 이름과 무기를 String 형태로 받는 매개변수
        System.out.println(이름 + "(이)가 " + 무기 + "(으)로 공격합니다.");
    }
}

👽 매개변수를 사용하여 마지막 공격을 기억하고 다시 공격하는 프로그램

class Main {
    public static void main(String[] args) {
        전사 a전사 = new 전사();

        a전사.공격("브라이언", "칼");
        // 브라이언이(가) 칼(으)로 공격합니다.

        a전사.재공격();
        // 브라이언이(가) 칼(으)로 공격합니다.

        a전사.공격("필립", "창");
        // 필립이(가) 창(으)로 공격합니다.

        a전사.공격("마크", "지팡이");  
        // 마크(가) 지팡이(으)로 공격합니다.

        a전사.재공격();
        // 가장 마지막에 공격한 마크, 지팡이를 last_name, last_weapon으로 기억하여 출력
        // 마크(가) 지팡이(으)로 공격합니다.

        a전사.재공격();
        // 마크(가) 지팡이(으)로 공격합니다.
    }
}

class 전사{
	// 재공격 메소드에 사용할 변수 last_name과 last_weapon 선언
    String last_name;
    String last_weapon;

    void 공격(String name, String weapon) {
    	// 공격 메소드에서 사용한 name과 weapon을 재공격 메소드에서 사용해주기 위해서 
        // last_name과 last_weapon에 저장, 선언, 초기화
        this.last_name = name;
        this.last_weapon = weapon;

        System.out.println(name + "(이)가 " + weapon + "(으)로 공격합니다.");
        // 여기서 출력될 때에는 공격의 매개변수인 name과 weapon이 들어가서 출력
    }
    void 재공격(){
        String name = last_name;
        String weapon = last_weapon;
        // 재공격 메소드에서는 공격 메소드에서 초기화된 값이 다시 재공격 메소드의 name과 weapon으로 초기화됨

        System.out.println(name + "(이)가 " + weapon + "(으)로 공격합니다.");
        // 여기서 출력될 때에는 공격의 매개변수가 아닌, 각각 last_name과 last_weapon을 
        // name과 weapon에 초기화시킨 값이 들어와서 출력됨 
    }
}

👽 서로 다른 3개의 TV를 1개의 리모콘으로 컨트롤

// 상황 : DVD방에 3개의 서로다른 tv가 있다. 영업을 하다보니 각 tv의 특별한 기능은 거의 사용될 일이 없고 기본적인 켜기/끄기 만 사용된다. 현재 리모콘이 3개나 있는습니다.
// 문제 : 알바를 편하게 하기 위해서 표준Tv 리모콘을 구현해주세요.

class Main {
    public static void main(String[] args) {
        System.out.println("== 표준Tv 리모콘 들여오기 전 ==");

        샤오미Tv a샤오미Tv = new 샤오미Tv();
        삼성Tv a삼성Tv = new 삼성Tv();
        LGTv aLGTv = new LGTv();

        a샤오미Tv.켜기();
        // 출력 => 샤오미Tv 켜집니다.
        a샤오미Tv.끄기();
        // 출력 => 샤오미Tv 꺼집니다.
        a샤오미Tv.vr켜기();
        // 출력 => 샤오미Tv vr켜기!

        a삼성Tv.켜기();
        // 출력 => 삼성Tv 켜집니다.
        a삼성Tv.끄기();
        // 출력 => 삼성Tv 꺼집니다.
        a삼성Tv.ar켜기();
        // 출력 => 삼성Tv ar켜기!

        aLGTv.켜기();
        // 출력 => LGTv 켜집니다.
        aLGTv.끄기();
        // 출력 => LGTv 꺼집니다.
        aLGTv.게임모드전환();
        // 출력 => LGTv 게임모드전환!

        System.out.println("== 표준Tv 리모콘 들여온 후 ==");

        // 표준Tv 리모콘을 만든다.
        표준Tv a표준Tv;

        // a표준Tv 변수에 샤오미Tv 객체를 연결한다.
        a표준Tv = a샤오미Tv;
        a표준Tv.켜기();
        // 출력 : 샤오기TV 켜집니다.
        a표준Tv.끄기();
        // 출력 : 샤오기TV 꺼집니다.

        // a표준Tv 변수에 삼성Tv 객체를 연결한다.
        a표준Tv = a삼성Tv;
        a표준Tv.켜기();
        // 출력 : 삼성TV 켜집니다.
        a표준Tv.끄기();
        // 출력 : 삼성TV 꺼집니다.

        // a표준Tv 변수에 LGTv 객체를 연결한다.
        a표준Tv = aLGTv;
        a표준Tv.켜기();
        // 출력 : LGTV 켜집니다.
        a표준Tv.끄기();
        // 출력 : LGTV 꺼집니다.

        // LGTV만의 고유 기능을 표준Tv 리모콘을 이용해서 호출하기 => 불가능
        // (LGTv) => a표준Tv 변수에 있던 표준Tv 리모콘이 LGTv리모콘화 해서 `aLGTv2` 변수에 들어간다.
        LGTv aLGTv2 = (LGTv)a표준Tv;
        aLGTv2.게임모드전환();
    }
}

class 표준Tv{
	// 표준Tv 클래스를 생성하고 각기 다른 3개의 클래스들을 모두 상속함
    void 켜기(){
    }
    void 끄기(){
    }
}
class 샤오미Tv extends 표준Tv{
    void 켜기() {
        System.out.println("샤오미Tv 켜집니다.");
    }

    void 끄기() {
        System.out.println("샤오미Tv 꺼집니다.");
    }

    void vr켜기() {
        System.out.println("샤오미Tv vr켜기!");
    }
}

class 삼성Tv extends 표준Tv{
    void 켜기() {
        System.out.println("삼성Tv 켜집니다.");
    }

    void 끄기() {
        System.out.println("삼성Tv 꺼집니다.");
    }

    void ar켜기() {
        System.out.println("삼성Tv ar켜기!");
    }
}

class LGTv extends 표준Tv{
    void 켜기() {
        System.out.println("LGTv 켜집니다.");
    }

    void 끄기() {
        System.out.println("LGTv 꺼집니다.");
    }

    void 게임모드전환() {
        System.out.println("LGTv 게임모드전환!");
    }
}

👽 자동차 리모콘으로 페라리 객체를 연결한 후 해당 리모콘이 가리키고 있는 객체를 다시 페라리 리모콘으로 참조하게 하는 프로그램

class Main {
    public static void main(String[] args) {
        // 수정가능지역 시작
        페라리 a자동차 = new 페라리();

        a자동차.달리다();
        a자동차.서다();
        a자동차.뚜껑이_열리다();
        // 수정가능지역 끝
    }
}
class 자동차 {
    void 달리다() {
        System.out.println("부릉");
    }
    void 서다() {
        System.out.println("멈춰!");
    }
}
class 페라리 extends 자동차 {
    void 뚜껑이_열리다() {
        System.out.println("뚜껑 열려유");
    }
}

👽 사람이 a왼팔 이라는 변수를 가질 수 있게 만들기

class Main {
    public static void main(String[] args) {
        사람 a사람 = new 사람();

        a사람.나이 = 20;
        a사람.a왼팔 = new();
    }
}

class 사람 {
    // 클래스안에 변수를 정의 할 수 있다.
    int 나이;
    팔 a왼팔;
}
classextends 사람 {

}

👽 전사가 가지고 있는 변수 a무기가 칼과 활에 모두 호환되게 하는 프로그램

class Main {
    public static void main(String[] args) {
        전사 a전사 = new 전사();

        a전사.나이 = 20;
        a전사.a무기 = new();
        a전사.a무기 = new();
    }
}

class 전사{
    int 나이;
    무기 a무기; 	// a무기 변수를 무기 클래스에 선언
}

class 무기 {
}
classextends 무기{		// 활과 칼 클래스가 무기 클래스의 상속을 받도록 선언
}
classextends 무기{
}

0개의 댓글