Math 클래스는 인스턴스 멤버는 하나도 없고 죄다 static 멤버이다. 따라서 클래스가 자동으로 로딩되니(컴파일러가 import.lang.*을 자동으로 삽입해주니) 메모리에 static 멤버는 바로 적재되니 인스턴스 생성없이 사용이 가능하며 인스턴스를 생성할 필요가 없어서 private 접근 지정자로 호출이 불가능하게끔 하고 있다.
// 가능하다. 나는 참조타입이 Unit이라 더 넓은 타입인 GroundUnit으로 변환이 불가능한 줄 알았다. // 근데 인스턴스 타입이 GroundUnit이어서 가능한 것이다. // u2처럼 만드는 것과 차이점이 무엇이 있냐면 // 이렇게 형변환을 자유로이(멤버의 범위를 여의봉 마냥 자유자재로 늘렸다 줄였다) 할 수 있는 장점이 있다. GroundUnitgu= (GroundUnit)u; // 컴파일 에러는 안 나는데 런타임 에러, // u2는 Unit 인스턴스 타입이라 참조 가능한 한계가 Unit 뿐임. // 하지만 위는 GroundUnit의 인스턴스라 참조타입에 따라서 여의봉 마냥 참조 가능한 멤버의 한계가 달라짐. // GroundUnit gu2 = (GroundUnit)u2;
// System.out.println(u.y); 참조타입이 Unit이라 Unit꺼가 아니라 컴파일 에러 System.out.println(gu.y); // GroundUnit의 멤버까지 접근이 가능하다. } }
확실히 구현해야하는 메소드들은 오버라이딩 보다는 추상메소드를 쓰자
추상 메소드로 쓰면 구현을 하지 않으면 컴파일 에러가 나서 무조건 구현해야하는구나 라고 개발자가 더 확실히 인식할 수 있다. 또한 오버라이딩은 해도 그만 안 해도 그만이라 잘못된 메소드를 만들어서 메소드 오버로딩이 될 수도 있는데 추상 메소드는 그럴 가능성이 없다.
매개변수의 다형성에 대해 묻는 얘기인 것 같다. 이렇게 다형성을 이용하면 메소드 오버로딩 해야할 경우의 수를 많이 줄일 수 있다. 하지만 특정 인스턴스에 특화된 게 아니라 공통된 멤버들만 사용이 가능하다는 제약이 있다. 진짜 클래스의 다형성, 매개변수의 다형성, 메소드의 다형성, 인터페이스의 다형성 등등 그지같이 많다.
null
Interface
Interface를 구현한 클래스(인스턴스)
Interface를 구현한 클래스의 자식 클래스(인스턴스)
내부 클래스의 변수 사용하기
사용할 일이 있을라나…
인스턴스 변수
1 2 3 4 5 6 7 8 9 10 11 12
classOuter { // 외부 클래스 classInner { // 내부 클래스(인스턴스 클래스) int iv=100; } } classTest { publicstaticvoidmain(String[] args) { Outero=newOuter(); Outer.Innerii= o.newInner(); System.out.println(ii.iv); } }
클래스 변수
1 2 3 4 5 6 7 8 9 10 11
classOuter { // 외부 클래스 classInner { // 내부 클래스(인스턴스 클래스) staticint iv=100; } } classTest { publicstaticvoidmain(String[] args) { Outer.Innerii=newOuter.Inner(); System.out.println(ii.iv); } }