포스트

18. 레퍼런스와 Object 클래스

레퍼런스와 Object 클래스에 대해서 이해해보자

18. 레퍼런스와 Object 클래스

Static 필드의 한계 극복

static 필드 기능 추가

위 처럼 기존에 있던 메뉴들에 공지사항 기능을 추가한다 치자…
게시판과 동일한 기능이기 때문에 재활용하면 될 것같지만
static을 사용했기에 공지사항과 게시판 기능은 계속 붙어 다녀야한다.

왜?
static은 상수로 프로그램 내에 static이 붙은 (클래스, 메서드, 변수)는 단 하나 밖에 없기 때문이다.
게시판 데이터와 공지사항 데이터는 하나의 변수에 들어갈 수 밖에 없다는 뜻이다.

이렇게되면 재사용도 어렵고 코드 수정도 불편하다.

static 클래스를 복사 그렇다면 지금까지 했던 것처럼.. 클래스를 복사해서 공지사항~ 이러고 만들면 되지않는가?

클래스를 복사해서 사용할 때 문제점

코드 중복 됨 (= 변경이 어려움)

복사해서 만든 클래스는 버그나 기능 추가 시 복사했던 모든 클래스를 변경해야하고 이는 유지보수와 코드 재사용이 힘들다.

해결책 : 같은 코드를 사용 그러나 데이터는 분리

  • Board 리스트 라는 클래스에 메서드를 만들고 이를 인스턴스 클래스로 가져와 new로 생성한다고 칠때.
    안에 있는 메서드는 분리되지않고 인스턴스 필드만 분리되어 사용할 수 있다.

대체 무슨말인데..?

1
2
// this 내장 변수는 메서드가 정의된 클래스의 인스턴스 주소를 받기 때문에...
레퍼런스.메서드(); // A클래스 레퍼런스. A클래스 메서드로 사용이 가능하다

Object 클래스

  • 자바의 최상위 클래스이다.
  • 자바의 모든 클래스는 Object의 하위 클래스이다.
  • 클래스가 가져야할 기본 메서드를 정의하고 있다.

Object 클래스가 가지고 있는 메서드…

  1. toString → 인스턴스의 상태를 문자열로 리턴 : 리턴값 = “클래스명(패키지명 포함)@해시값”
  2. equals → 인스턴스가 같은지 비교 : 리턴값 = true, false
  3. hashcode → 인스턴스 식별 번호 : 리턴값 = hash 알고리즘으로 생성한 int값
  4. getClass → 인스턴스의 클래스 정보 : 리턴값 = class 객체
  5. clone → 인스턴스를 복제한 후 생성된 객체 : 리턴값 = 인스턴스 주소

Object 클래스와 상속관계

  • class A{ - } →컴파일러 변환→ class A extends Object(자동 추가){ - } →컴파일→ A.class
  • Object의 코드를 내 것처럼 사용한다 의미 = Object를 상속 받는다.

상속 위 코드를 설명하는 그림이다.

1
2
3
4
5
6
7
8
9
10
// extends Object가 생략된 것
class A{
	void m1(){ - }
}
class B{
	void m2(){ - }
}
class C{
	void m3(){ - }
}

상속의 상속 위 코드를 설명하는 그림이다.

1
2
3
4
5
6
7
8
9
class A { //extends Object가 생략된 것
	void m1(){ - }
}
class B extends A { 
	void m2(){ - }
}
class C extends B { 
	void m3(){ - }
}
1
2
C obj = new C();
obj.toString(); // -> C.toString()X -> B.toString()X -> A.toString()X -> Object.toString() 호출됨

상속의 의미

상속 : 코드를 가져온다X → 코드를 공유한다.

  • class A extends Object A[ Object[ - ] ] X ? ⇒ A[ - ] ←사용← Object[ 공유 ] →사용→ B[ - ]
1
2
3
void m1(Object obj){ - } // m1() 메서드를 만든 개발자의 의도는 파라미터 값으로 어떤 클래스의 인스턴스라도 받겠다는 의미
Object m2(){ - }         // 이 메서드는 어떤 타이브이 인스턴스 주소를 리턴할 것이다.
												 // 메서드를 호출하는 상황에 따라 어떤 클래스의 인스턴스를 리턴하는지 파악하고 리턴 값을 받아라

형변환

Object를 꺼내 쓸 때 사용할 클래스로 변환이 필요한데 이를 형변환이라고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Object[] toArray(){
	Object[] arr = new Object[size];
	for(int i = 0; i < arr.length; i++){
		arr[i] = list[i];
	}
	return arr;
}

private void listUser(){
	System.out.println("번호 이름 이메일");
	for (Object obj : userList.toArray()){
		User user = (User) obj;
		System.out.printf("%d %s %s\n", user.getNo(), user.getName(), user.getEmail());
	}
}
1
2
3
4
5
6
for (Object obj : userList.toArray())
// User user : (Object[])userList.toArray 로는 사용하지 않는걸 권장한다.

for(Object user : userList.toArray()){
	~((User)user.getName()) // <- 이렇게 사용은 가능하지만 일일히 설정해줘야하기 때문에 불편하다
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.