TIL


2022.03.18


オペレーティングシステムトレーニングを受講スプリング117~140 P

ばね


継承とインタフェース

  • インタフェース:実装クラスisableインタフェース
  • 解釈:実装クラスはインタフェース可能である.
  • 例:クジラは泳ぐことができます.
  • 親は属性(属性とメソッド)を子に継承し、インタフェースはクラスによって「何ができるか」になります.強制実行
    上流クラス継承の特性が豊富であればあるほど,インタフェースを強制的に実装する方法が少ないほどよい.
    package ex03.inheritance02;
    
    public class 동물 {
    	String myClass; // 객체 변수
    	
    	public 동물() { // 생성자
    		myClass = "동물";
    	}
    	
    	void showMe() { // 객체 메서드
    		System.out.println(myClass);
    	}
    }
    
    package ex03.inheritance02;
    
    public interface 날수있는 {
    	void fly();
    }
    
    package ex03.inheritance02;
    
    public interface 헤엄칠수있는 {
    	void swim();
    }
    
    package ex03.inheritance02;
    
    public class 포유류 extends 동물{
    	public 포유류() {
    		myClass = "포유류";
    	}
    }
    
    package ex03.inheritance02;
    
    public class 조류 extends 동물 {
    	public 조류() {
    		myClass = "조류";
    	}
    }
    
    package ex03.inheritance02;
    
    public class 고래 extends 포유류 implements 헤엄칠수있는 {
    	public 고래() {
    		myClass = "고래";
    	}
    
    	@Override
    	public void swim() {
    		System.out.println("고래헤엄");
    	}
    }
    
    package ex03.inheritance02;
    
    public class 박쥐 extends 포유류 implements 날수있는{
    	
    	public 박쥐() {
    		myClass = "박쥐";
    	}
    
    	@Override
    	public void fly() {
    		System.out.println("박쥐날다");
    	}
    }
    
    package ex03.inheritance02;
    
    public class 참새 extends 조류 implements 날수있는{
    	public 참새() {
    		myClass = "참새";
    	}
    
    	@Override
    	public void fly() {
    		System.out.println("참새날다.");
    	}
    }
    
    package ex03.inheritance02;
    
    public class 펭귄 extends 조류 implements 헤엄칠수있는{
    	public 펭귄() {
    		myClass = "펭귄";
    	}
    
    	@Override
    	public void swim() {
    		System.out.println("펭귄헤엄치다");
    	}
    }
    
    package ex03.inheritance02;
    
    public class Driver {
    	public static void main(String[] args) {
    		날수있는 날라리1 = new 박쥐();
    		날라리1.fly();
    		
    		날수있는 날라리2 = new 참새();
    		날라리2.fly();
    		
    		헤엄칠수있는[] 맥주병들 = new 헤엄칠수있는[2];
    		
    		맥주병들[0] = new 고래();
    		맥주병들[1] = new 펭귄();
    		
    		for(헤엄칠수있는 맥주병 : 맥주병들) {
    			맥주병.swim();
    		}
    	}
    }
    

    継承とTメモリ

  • 子クラスのインスタンスを作成すると、親クラスのインスタンスも同時に作成されます.
  • Objectクラスは、すべてのクラスで最も優れたクラスのインスタンス
  • package ex03.inheritance03;
    
    //상위클래스
    
    public class Animal {
    	public String name;
    	
    	public void showName() {
    		System.out.printf("안녕 나는 %s야. 반가워\n",name);
    	}
    }
    
    package ex03.inheritance03;
    
    public class Penguin extends Animal {
    	public String habitat;
    	
    	public void showHabitat() {
    		System.out.printf("%s는 %s에 살아\n",name,habitat);
    	}
    }
    
    package ex03.inheritance03;
    
    public class Driver {
    	public static void main(String[] args) {
    		
    		Penguin pororo = new Penguin();
    		
    		pororo.name = "뽀로로";
    		pororo.habitat = "남극";
    		
    		pororo.showName();
    		pororo.showHabitat();
    		
    		Animal pingu = new Penguin();
    		
    		pingu.name = "핑구";
    		//pingu.habitat = "EBS";
    		
    		pingu.showName();
    		//pingu.showHabitat();
    		
    		//Penguin happy = new Animal();
    		
    	}
    }
    

    大げさ?かふか

  • 上書き:同じメソッド名、同じパラメータリストを使用して親を再定義するメソッド
  • オーバーロード:同じ方法名、異なるパラメータリストを使用して複数のメソッドを繰り返し定義
  • 多形性とTメモリ

  • 親タイプのオブジェクト参照変数を使用しても、サブクラスの上書きメソッドは
  • を呼び出します.
    package ex03.polymorphism01;
    
    public class Animal {
    	public String name;
    	
    	public void showName() {
    		System.out.printf("안녕 나는 %s야. 반가워\n",name);
    	}
    }
    
    package ex03.inheritance03;
    
    //상위클래스
    
    public class Animal {
    	public String name;
    	
    	public void showName() {
    		System.out.printf("안녕 나는 %s야. 반가워\n",name);
    	}
    }
    
    package ex03.polymorphism01;
    
    public class Penguin extends Animal {
    	public String habitat;
    	
    	public void showHabitat() {
    		System.out.printf("%s는 %s에 살아\n",name,habitat);
    	}
    
    	//오버라이딩 : 재정의 - 상위클래스의 매서드와 같은 메서드이름, 같은 인자 리스트
    	@Override
    	public void showName() {
    		System.out.println("내이름 알아서 뭐하게요!");
    	}
    	
    	//오버로딩 : 중복정의 - 같은 메서드 이름, 다른 인자 리스트
    	public void showName(String yourName) {
    		System.out.printf("%s 안녕 나는 %s라고 해\n",yourName,name);
    	}
    }
    
    package ex03.polymorphism01;
    
    public class Driver {
    	public static void main(String[] args) {
    		Penguin pororo = new Penguin();
    		
    		pororo.name = "뽀로로";
    		pororo.habitat = "남극";
    		
    		pororo.showName();
    		pororo.showName("초보람보");
    		pororo.showHabitat();
    		
    		Animal pingu = new Penguin();
    		
    		
    		pingu.name = "핑구";
    
    		
    		//
    		pingu.showName();
    
    		
    	}
    }

    カプセル化:情報を非表示

  • アクセス制御者とオブジェクトメンバー(インスタンスメンバー)の書き込み時および静的メンバー(クラスメンバー)の書き込み時の比較
  • オブジェクトメンバーのアクセス制御者


    Case 1. メンバー変数、同じパッケージ

    Case 2. メンバー変数、その他のパッケージ

    Case 3. 静的変数、同じパッケージ

    Case 4. 静的変数、その他のパッケージ

    参照変数のコピー

  • デフォルトのデータ型変数をコピーすると、値はCall By Value(値呼び出しによる)によってコピーされ、2つの変数の間に影響はありません
  • package ex03.reference;
    
    public class CallByValue {
    	public static void main(String[] args) {
    		int a = 10;
    		int b= a ;
    		
    		b = 20;
    		
    		System.out.println(a);
    		System.out.println(b);
    	}
    }
    
  • オブジェクト参照変数格納値をアドレス
  • に解析
    package ex03.reference;
    
    public class CallByReference {
    	public static void main(String[] args) {
    		Animal ref_a = new Animal();
    		Animal ref_b = ref_a;
    		
    		//둘 다 같은 곳을 가리킴
    		ref_a.age = 10;
    		ref_b.age = 20;
    		
    		System.out.println(ref_a.age);
    		System.out.println(ref_b.age);
    	}
    }
    
    class Animal{
    	public int age;
    }