자바 형변환 질문

interface Operation {
public void cut();

public void wash();

}

class Hair implements Operation {
private String type;

Hair(String type) {
    this.type = type;
}
@Override
public void cut() {
	System.out.println(type + "를 자르다");
}
 @Override
public void wash() {
	System.out.println(type + "를 감다");
}

public void tint(String color) {
	 System.out.println(type + "를 " + color + "색으로 염색하다");
}

}

class Fruit implements Operation {
private String type;

Fruit(String type) {
    this.type = type;
}
@Override
public void cut() {
	System.out.println(type + "를 자르다");
}
@Override
public void wash() {
	System.out.println(type + "를 씻다");
}

public void pack(int cnt) {
	System.out.println(type + "를 " + cnt + "개 포장하다");
}

}

public class Main {
public static void run(Operation oper) {
if (oper instanceof Hair) {
Hair hair = (Hair) oper;
hair.cut();
hair.wash();
hair.tint(“brown”);
} else if (oper instanceof Fruit) {
Fruit fruit = (Fruit) oper;
fruit.cut();
fruit.wash();
fruit.pack(10);
}
}

public static void main(String[] args) {

	Operation oper = null;
	oper = new Hair("긴 머리");
	// 매개변수 다형성, instanceof 연산자 사용(형변환)
	run(oper);
	oper = new Fruit("사과");
	run(oper);
}

}

object를 바로 출력해서 그런거같아요

System.out.println(oper + "를 자르다");

여기서 보시면 oper를 문자열처럼 취급하셨는데 object를 바로 print하면 주소가 나오는 것 같네요. Operation 안에 getType() 같은 함수를 추가하시거나 해야 할 것 같습니다

맞아요 string을 출력하거나, toString 메소드를 오버라이딩하세용 ㅎㅎㅎ

String을 어떻게 출력시키나요? 타입을 바꿔봤는데 컴파일이 안 되더라구요

여러가지 방법이 있는데요.

interface Operation {
    public void cut();
    
    public void wash();
}

class Hair implements Operation {
    private String type;

    Hair(String type) {
        this.type = type;
    }
    @Override
    public void cut() {
    	System.out.println(type + "를 자르다");
    }
     @Override
    public void wash() {
    	System.out.println(type + "를 감다");
    }

    public void tint(String color) {
    	 System.out.println(type + "를 " + color + "색으로 염색하다");
    }
}

class Fruit implements Operation {
    private String type;
    
    Fruit(String type) {
        this.type = type;
    }
    @Override
    public void cut() {
    	System.out.println(type + "를 자르다");
    }
    @Override
    public void wash() {
    	System.out.println(type + "를 씻다");
    }
    
    public void pack(int cnt) {
    	System.out.println(type + "를 " + cnt + "개 포장하다");
    }
}

public class Main {
    public static void run(Operation oper) {
    	if (oper instanceof Hair) {
    		Hair hair = (Hair) oper;
    		hair.cut();
    		hair.wash();
    		hair.tint("brown");
    	} else if (oper instanceof Fruit) {
    		Fruit fruit = (Fruit) oper;
    		fruit.cut();
    		fruit.wash();
    		fruit.pack(10);
    	}
    }

    public static void main(String[] args) {
    
    	Operation oper = null;
    	oper = new Hair("긴 머리");
    	// 매개변수 다형성, instanceof 연산자 사용(형변환)
    	run(oper);
    	oper = new Fruit("사과");
    	run(oper);
    }
}

문자열 사용은 String타입인 type 변수를 사용하면 됩니다.

인터페이스는 함수의 호출을 정의하기 위해 사용됩니다. 일종의 약속이죠. 이 인터페이스를 따르는 친구는 이러한 메소드가 있으니 호출해서 써라~ 작성하신 코드에는 그런 부분이 없죠.

또한 static 함수는 꼭 필요한 개념인 경우를 제외하면 사용하지 않아야합니다.
cut과 wash 메소드는 객체의 변수 type과 관련있는 내용이기에 static이 아닌 메소드가 되어야합니다.

또한 생성자에서 받은 매개변수를 필드로 옮겨야합니다.

오 감사합니다

main 함수를 다음과 같이 만들면 인터페이스에 대해서도 좀 이해가 가실겁니다.

public class Main {
    public static void lets_cut(Operation oper) {
    	oper.cut();
    }

    public static void main(String[] args) {
    
    	Operation oper = null;
    	oper = new Hair("긴 머리");
    	// 매개변수 다형성, instanceof 연산자 사용(형변환)
    	lets_cut(oper);
    	oper = new Fruit("사과");
    	lets_cut(oper);
    }
}

감사합니다!