본문 바로가기
카테고리 없음

22-09-02 자바이야기(ft.ITwill 국비지원학원)

by Hunihu 2022. 9. 2.

Final 복습

Final의 개념

final의 개념컬러는 한마디로 "불가역적"이다.

final 지역 변수는 값이 한번 초기화되면 그값을 변경할 수 없고,

 

클래스 필드에서 멤버 변수로 정의된 final은 값을 한번은 초기화해야되고, 초기화된 경우에는 값을 변경할 수 없는..

 

단단한 바위가 연상되는 문법이다..

 

final 메서드는 오버라이딩도 불가능하네..? ㅠㅠ , 기능적으로 완전 묶어버리는 문법이다;;

 

클래스에 붙으면 상속도 불가능하고 자손도 만들 수 없는 ㅠㅠ..

 

그래서인지 자바 고유의 기능처럼 쓰던 메서드들은 외부사람이 수정할 수 없게 final로 고정되어있는 경우가 많다.

 

예를들면 System.out.println을 할때 쓰는 System 클래스라던지 String 클래스라던지..

 

 

java.lang.Object 클래스

 자바에서 가장 상위 클래스인 친구이다. 거의 시조라고 보면 된다.

java.lang.object 란 무엇인가?

그러므로 object 클래스의 public 멤버들은 자식클래스에서 상속받아서 사용할수있고 오버라이딩을 통해 새롭게 정의하여 사용할 수도 있다. toString(), equals(), hashCode() 등의 메서드는 object 클래스에 속해있다. 그래서 이들 메서드들 또한 자손클래스에서 재정의하여 사용할 수 있다.

toString()메서드의 오버라이딩
Point라는 클래스에서 object 클래스의 toString()메서드를 재정의함.
toString을 오버라이드 한 이후 Point 객체를 출력했을 때

출력해보면 위에 재정의된 포맷대로 결과가 출력되게 된다.

equals()메소드 오버라이딩

Object 클래스의 메소드인 equals()를 오버라이딩 해보자. object 클래스에서 equals()의 원래 기능은

두 객체의 해쉬코드(주소)값이 같으면 True 아니면 false를 출력하는 것이였다.

즉 ==과 같은 기능을 수행하는것인데.. 이번에 Object로부터 equals() 메소드를 받아와서 오버라이딩해서 x,y값이 동일하다면 true를 출력하도록 기능을 변경해보았다.

그리고 이 기능은 String 클래스 에는 이미 추가되어있어서 

이런식으로 작업했을때 equals 메소드를 사용하면 String 타입에서는 hashCode가 다른 객체이더라도 True가 나온다.

 

그리고 equals()를 오버라이딩 했을때에는 대부분 hashCode() 메서드도 같이 오버라이딩 해준다.

hashCode() 오버라이딩

Integer.valueof(변수)를 통해 객체로 만들어주고 해당 객체의 hasCode를 비교해주면 된다.

 

추상메서드

추상 메서드 개념

추상메서드는 말그대로 추상적인 개념을 부모클래스에서 미리 상정하는 경우이다. 예를 들어 동물이라는 부모클래스가 있을때 그 자식클래스는 물에서 사는 동물, 육지에서 사는 동물, 하늘에서 사는 동물들로 나눌 수 있다.

이 동물들은 모두 다 움직인다.(move) 그런데 이때 모두 다 움직인다는 개념이지만 어떻게 움직이는지는 동물마다 다르다.

 

물고기는 헤엄(?)을 쳐서 이동할것이고 조류는 날개를 이용할것이고 육지동물들은 다리를 이용할 것이다.

이렇게 자식클래스마다 방식은 다양하지만 결국 "이동"한다는 공통된 개념을 가질때 부모클래스에서 추상메서드를 정의한후 각 자식클래스에서 오버라이드를 이용해 정의하면 된다.

 

Animal 이란 추상 부모클래스 안에 추상메서드 move()가 정의되어있다.
Dog 클래스가 부모의 추상메서드 move를 오버라이딩 했다.
Fish 클래스가 부모의 추상메서드 move를 오버라이딩 했다.
Bird 클래스가 부모의 추상메서드 move를 오버라이딩 했다.
Main에서 추상 부모클래스와 자식클래스 간에 관계 표현

저런식으로 다형성을 사용하면 dog에서 실제로는 오버라이딩된 메서드를 출력하지만 속해있는것은 부모클래스의 추상메서드이다.

 

추상메서드는 자식클래스들끼리의 데이터 통합을 하는데 유리한 강점이 있다. 변수의 선언이나 메서드 명칭등에서 부모클래스를 이용해 통일해서 이용할 수 있다.