본문 바로가기
자바 Java/Java 프로그래밍

자바 개념

by udeserveit1 2024. 8. 10.

단일다중상속

 

fianl  클래스

* 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다

 

Object 클래스

- object는 최상위 부모 클래스다

-

 

오버라이팅 

- 부모클래스로부터 상속받은 메서드의 내용을 재정의 하는 것 

 

예를 들어, object에게 상속받는 String 클래스 : 둘 다 equals를 구현하고 있지만 조금씩 다르다

 

super와 super()

super

-  부모 클래스의 멤버를 참조할 수 있는 키워드 

   부모를 지칭하는 키워드다 ( 나를 지칭할 수 있는 건 this와 같은)

 

public void setCarInfo(String model, String color, double price) {
    super.model = model; // model은 부모 필드에 set
    super.color = color; // color는 부모 필드에 set
    this.price = price; // price는 자식 필드에 set
}


예시

 

 

 

 

 

다형성

 

자동  형변완이 완료 된것만 돌아갈 수 있는 것

 

 

*instanceof

 

 

 

 

* 추상클래스

 

 클래스는 설계또 추상클래스는 미완성된 설계도

즉 부모는 완성시키지 않은 메소드를 갖고 있다 자식이 extends 해서 이제서야 완성시킴

텅 비어있는 메소드 자식들이 받아서 완성시켜서 쓰는 

▼ 추상화 

public abstract class 추상클래스명 {

}

- 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.

추상메서드

아직 구현되지 않는 미완성된 메서드

추상메서드 선언

public abstract class 추상클래스명 {
		abstract 리턴타입 메서드이름(매개변수, ...);
}

 

추상클래스 상속

추상메서드는 extends 키워드를 사용하여 클래스에서 상속

public class 클래스명 extends 추상클래스명 {
		@Override
    public 리턴타입 메서드이름(매개변수, ...) {
		       // 실행문
    }
}

**상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 합니다. (인터페이스에 없는 특징)

 

 

 

 

클래스에도 abstract

 

구현시키지 않고 ;

 

인터페이스

 

두 객체를 연결해주는 다리역할

 

인터페이스 선언

public interface 인터페이스명 { 

}

접근 제어자 지정

 

인터페이스 구성

 

 

  • 모든 메서드는 public abstract이어야 합니다.
    • 생략 가능합니다. (static 메서드와 default 메서드 예외)
  • 생략되는 제어자는 컴파일러가 자동으로 추가해줍니다.
public interface 인터페이스명 { 
		public static final char A = 'A';
    static char B = 'B';
    final char C = 'C';
    char D = 'D';

    void turnOn(); // public abstract void turnOn();
}

인터페이스 구현

public class 클래스명 implements 인터페이스명 { 
			// 추상 메서드 오버라이딩
			@Override
	    public 리턴타입 메서드이름(매개변수, ...) {
			       // 실행문
	    }
}

● 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩

●  만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경

 

인터페이스 상속

  인터페이스 간의 상속은 implements 가 아니라 extends 키워드를 사용합니다.

●  인터페이스는 클래스와는 다르게 다중 상속이 가능합니다.!

public class Main implements C {

    @Override
    public void a() {
        System.out.println("A");
    }

    @Override
    public void b() {
				System.out.println("B");
    }
}

interface A {
    void a();
}
interface B {
    void b();
}
interface C extends A, B { }

 

디폴트 메서드

 

📌 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드

  • 메서드 앞에 default 키워드를 붙이며 블럭{ }이 존재해야 합니다.
  • default 메서드 역시 접근 제어자가 public이며 생략이 가능합니다.
  • 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없습니다.
public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }


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

        // 디폴트 메서드 재정의 없이 바로 사용가능합니다.
        main.aa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
}

 

*static 메서드

 인터페이스에서 static 메서드 선언이 가능합니다.

  • static의 특성 그대로 인터페이스의 static 메서드 또한 객체 없이 호출이 가능합니다. ( 예 classd이름.method())
  • 구현하는 부분이 있어야 한다 디폴트와 같이
        // static 메서드 aaa() 호출
        A.aaa();

 

 

package week03.hasExample.interSample;

public class Main {
    public static void main(String[] args) {

        // A 인터페이스에 구현체 B 대입
        A a1 = new B();
        a1.a();
        // a1.b(); // 불가능 //a1은 인터페이스 A 타입(자동 형변환)이기 때문에, a() 메서드만 가지고 있음!!

        System.out.println("\nB 강제 타입변환");
        B b = (B) a1;
        b.a();
        b.b(); // 강제 타입변환으로 사용 가능
        System.out.println();

        // A 인터페이스에 구편체 B를 상속받은 C 대입
        A a2 = new C();
        a2.a();
        //a2.b(); // 불가능
        //a2.c(); // 불가능

        System.out.println("\nC 강제 타입변환"); 
        C c = (C) a2;
        c.a();
        c.b(); // 강제 타입변환으로 사용 가능
        c.c(); // 강제 타입변환으로 사용 가능


    }
}

interface A {
    void a();
}
class B implements A {
    @Override
    public void a() {
        System.out.println("B.a()");
    }

    public void b() {
        System.out.println("B.b()");
    }
}
class C extends B {
    public void c() {
        System.out.println("C.c()");
    }
}

 

인터페이스의 다형성

 

'자바 Java > Java 프로그래밍' 카테고리의 다른 글

Java 객체지향 & 클래스 & 생성자  (0) 2024.07.09