본문 바로가기

컴퓨터공부/Java

[java] instanceof 연산자, 형변환이 가능한것이냐 불가능을 체크하고 객체를 만들어야되는 코드, 추상메서드 (abstract method),

by Life & study 2023. 11. 6.
반응형

 

# instanceof 연산자

 

형변환

가능 true

불가능 false

 

코드,

 

class Car {
}

class FireEngine extends Car {
}

public class Main {
    public static void main(String[] args) {
        Car c = new FireEngine();

        System.out.println(c instanceof Car); // true
        System.out.println(c instanceof FireEngine); // true
        System.out.println(c instanceof String); // false
    }
}

 

 

- 사용법

 

c instanceof fireEngine  형변환이 가능한지를 확인하고

FireEngine fe = (FireEngine)c;로 형변환을 해야된다.

 

 

## 형변환이 가능한것이냐 불가능을 체크하고 객체를 만들어야되는 코드

 

class Car {
}

class FireEngine extends Car {
}

public class Main {
    public static void main(String[] args) {
        Car c = new FireEngine();

        if (c instanceof FireEngine) {
            FireEngine fe = (FireEngine) c; // 형 변환
            System.out.println("c는 FireEngine의 인스턴스입니다.");
        } else {
            System.out.println("c는 FireEngine의 인스턴스가 아닙니다.");
        }
    }
}

 

 

### 매개변수의 다형성

 

다형성 

1.조상타입 참조변수로 자손 타입의 참조변수를 다루기

2. 참조변수의 형변환 -> 리모콘 바꾸기 (사용가능한 멤버의갯수을 일치시켜라)

3. intancfeof 연산자 형변환 가능여부확인

4. ( 파라미터 에 조상타입을 넣고 1개의 메소드로 통신하자) 

  1개의 메소드에 조상타입파라미터를 작성해서 통일한 통신을 (구매메소드) 해당

 메소드로 1개로 모든 구매를 일으키는 = 다형성메소드의장점.

 

 

4번에 대한 개념 코드

 

Java에서 다형성을 이용하면 여러 타입의 객체를 하나의 타입(상위 클래스나 인터페이스)으로 처리할 수 있습니다. 이를 통해 코드의 재사용성을 높이고 유연성을 얻을 수 있습니다.

아래에 이를 적용한 구매 시스템 예시를 들어 보겠습니다.

먼저, Product라는 상위 클래스를 만들고, Book과 Electronics라는 두 가지 상품을 나타내는 하위 클래스를 만듭니다:

java
abstract class Product {
    abstract void purchase();
}

class Book extends Product {
    @Override
    void purchase() {
        System.out.println("책을 구매하였습니다.");
    }
}

class Electronics extends Product {
    @Override
    void purchase() {
        System.out.println("전자제품을 구매하였습니다.");
    }
}
그 다음으로, 이들 Product 객체를 파라미터로 받아서 구매하는 메소드를 만듭니다:

java
public class Main {
    public static void main(String[] args) {
        Product myBook = new Book();
        Product myElectronics = new Electronics();
        
        buyProduct(myBook);
        buyProduct(myElectronics);
    }

    public static void buyProduct(Product product) {
        product.purchase();
    }
}
위 코드에서 buyProduct 메소드는 Product 타입의 파라미터를 받습니다. 이 메소드에 Book 객체와 Electronics 객체를 전달할 수 있는 이유는 Book와 Electronics 클래스가 Product 클래스를 상속받았기 때문입니다.

Spring과 Spring Boot에서도 이와 비슷한 개념을 적용할 수 있습니다. 예를 들어, 서비스 클래스를 인터페이스와 구현 클래스로 나누어 작성하고, 이를 컨트롤러에서 사용하는 경우에 이와 같은 다형성을 사용할 수 있습니다. 이렇게 하면 다양한 구현 클래스를 같은 인터페이스로 처리할 수 있으므로, 코드의 유연성을 높일 수 있습니다.

 

 

결론,

 

1.

    public static void buyProduct(Product product) {
        product.purchase();
    }

 

에서 (Product product)이부분은 product 이부분에

 

Product 변수타입

product 파라미터값

 

Product 변수타입

abstract class Product {
    abstract void purchase();
}

 

product 파라미터값

   abstract void purchase();

 

 

새로운 메소드에 ( Product 변수타입  product 파라미터값 )

product 파라미터값. Product 변수타입(안에 prochase()) 호출 해서 구입

 

  public static void buyProduct(Product product) {
        product.purchase();
    }

 

 

 

 

2.

 

 

 

 

 

 

- sout 팁

 

sout(p(파라미터).toString() + "~~~입니다");

sout(p(파라미터). + "~~~입니다"); 는 같은것이다

 

+ 결합연산자에서 .toString()을 생략할수있는 메소드가 숨어있다.

 

 

 

오버로딩: 같은메소드명 (파라미터만 바꿈)

 

 

cart[i].toString() + ", ";

", " 이부분이 자동으로  cart[i].toString() 에대한 내용을 한글로 채워서 보여짐

 

cart[i].toString() + ", "에서 ", "는 문자열 연결 연산자(+)를 통해 cart[i].toString()의 반환값 뒤에 추가되는 문자열입니다. toString() 메소드는 객체의 정보를 문자열로 변환한 결과를 반환합니다. 따라서 위 코드는 cart[i] 객체의 정보를 문자열로 변환하고, 그 뒤에 ", "를 추가하여 최종적으로 하나의 문자열을 생성합니다.

자바에서는 배열이나 컬렉션에 여러 종류의 객체를 저장할 수 있습니다. 이는 상속이나 인터페이스를 통한 다형성을 이용하면 가능합니다. 예를 들어, 앞서 언급한 Product 클래스와 이를 상속받는 Book, Electronics 클래스가 있다면, Product 배열에 Book 객체와 Electronics 객체를 모두 저장할 수 있습니다.

java
Product[] cart = new Product[2];
cart[0] = new Book();
cart[1] = new Electronics();

for (Product product : cart) {
    System.out.println(product.toString() + ", ");
}
Spring과 Spring Boot에서는 비슷한 방식으로 다양한 타입의 빈을 리스트나 맵 등의 컬렉션에 저장할 수 있습니다. 예를 들어, 같은 인터페이스를 구현하는 여러 빈을 리스트에 저장하고, 필요에 따라 사용하는 경우가 있습니다.

이처럼 다형성을 이용하면 여러 종류의 객체를 하나의 배열이나 컬렉션에 저장할 수 있으며, 이를 통해 코드의 유연성을 높일 수 있습니다.

 

####추상 클래스

 

미완성 설계도, 미완성 메서드를 갖고 있는 클래스

 

추상메서드 몸통 {} 없는 메서드를 말함.

=abstract 는 {}를 가지지않는다.  메서드와파라미터만 가짐.

 

 

abstract class Animal {
    abstract void sound(); // 추상 메소드
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍"); // 추상 메소드 구현
    }
}

에서 @Override 로 조상의 
{} 리터널 값을 가져올수 있다.

 

Audio ap = new Audio (); 에서

player가 조상이라면, player에서 player. player을 하면 실행되는데

 

player ap = new Audio(); 에서의 데이터 내부의 통신에대한 

 

개념을 자바와 spring 와 springboot에서 쓰이는 걸로 텍스트그림과 코드와 설명  매칭해서 알려줘

 

코드

class Player {
    void play() {
        System.out.println("재생 시작");
    }
}

class Audio extends Player {
    @Override
    void play() {
        System.out.println("오디오 재생 시작");
    }
}

public class Main {
    public static void main(String[] args) {
        Player player = new Audio();
        player.play(); // "오디오 재생 시작" 출력
    }
}

 

#####추상메서드 (abstract method)

 

abstract  리턴타입 메서드이름();    이다.

 

 

작성이유:

1.abstract  리턴타입 메서드이름();  을 해놓고 틀만 만들어놓고

주면 그것을 개발자가 구현해야되는 틀을 받는것과같다.

 

-호출이 가능한이유

 

1.상태: 상속을 통해서 자손이 완성된메소드 {}  된상태에서

2.객체 생성new로 한다음에 d.play();로 호출을하면 

3. abstract  리턴타입 메서드이름();에 abstract  메소드를 호출해서

4.

void play() {

 play(currentPos); 

} 로 호출이 가능하다.

 

 

 

2.void play() {

 play(currentPos); 

}

로 호출은 가능하다.

 

3. 객체생성후에 호출이 가능한 부분을 

abstract 로 void로 호출이 가능하다.

 

4. abstract  로 틀을 만든다음에 이것을 꼭 사용해야된다고  메소드 만든 규칙이다.

 

 

- 오버라이딩과 상속의 차이점과 사용법에 대한 이해도

 

1. 오버라이딩은 

부모- 자식관계를 이해한상태에서

 

그 자식을 @override를 사용해서 그 값을 재정의 하는것을 뜻하는것이고

 

2, 상속은

 

public static void 부모 extend 자식 이라면 

자식이라는 개념이 부모의 멤버과 값을 다 가진 상태를 뜻한다.

 

-코드이해도

속(Inheritance): 상속은 한 클래스의 속성과 메소드를 다른 클래스가 받아 사용할 수 있게 하는 것을 의미합니다. extends 키워드를 사용하여 구현합니다.
java
public class Parent {
    public void sayHello() {
        System.out.println("Hello from Parent");
    }
}

public class Child extends Parent {
    // Child 클래스는 Parent 클래스의 모든 속성과 메소드를 상속받습니다.
}
오버라이딩(Overriding): 오버라이딩은 상속받은 메소드를 하위 클래스에서 재정의하는 것을 의미합니다. 메소드 이름, 파라미터, 반환 타입은 동일하게 유지하면서 내부 로직을 변경합니다.
java
public class Child extends Parent {
    @Override
    public void sayHello() {
        System.out.println("Hello from Child"); // Parent 클래스의 sayHello() 메소드를 오버라이딩
    }
}

 

Player 

 

void play{

값1

}

값1

 

Audio extend Player

 

void play{

값2 변경 

}

player ap = new AudioPlayer();

 

ap.play (100); 을 호출했다면, 

 

값2 변경   호출된다.

 

왜 이렇게 된것이냐면,

 

player ap = new AudioPlayer();

그림 첨부

 

 

 

 

 

 

-규칙

 

 

1.abstract class 로 구현한 틀은 그대로  그안에 { 리터널} 값을 그대로 동시에 사용해야된다.

2.

 

 

반응형

댓글