# 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.
'컴퓨터공부 > Java' 카테고리의 다른 글
[java 공부] 제어자, 추상메서드, abstract , static (0) | 2023.11.07 |
---|---|
[java공부] 인터페이스와 추상메서드의 개념 (0) | 2023.11.07 |
[java 자바공부] import문 , import java.lang.* 으로 , import static 으로 스태틱으로 패키지문을, 제어자, abstract 추상의, 미완성의 (1) | 2023.11.04 |
[java 자바공부] 상속, 오버라이드, 오버로드 ,오브젝트 ,초기화 (0) | 2023.11.03 |
댓글