Java

Java, Package(패키지) / 다른 패키지에서 호출하기 (+접근제어자) / Object(최상위 클래스) 비교하기( == , equals())

greenyellow-s 2024. 7. 18. 17:25
Package

 

패키지를 만드는 이유?

|

관련이 있는 파일들 끼리 모아두기 위해서

 

윈도우 - 폴더
리눅스 - 디렉토리
자바 - package

 

패키지는 맨 첫번째 줄에 1번만 기술할 수 있다.

소문자로 기입해야한다.

 

패키지는 자바가 제공하는 기본 패키지 java.lang(default pakage)이다

 

 

접근 제어자에 따라 다른 패키지의 메소드나 클래스를 가져올 수도 있다.

  클래스 같은 패키지 다른 패키지 다른 패키지 자식 클래스
private o x x x
default o o x x
protected o o x o
public  o o o o

 

protected는 다른 패키지에서 Sub class 라면 접근이 가능하다.

단, Sub class로 생성해야만 접근할 수 있다. Super class로 생성하면 안된다.


[ com.zoo 패키지에 Zoo class ]

package com.zoo;

public class Zoo { //class Zoo { } default로 다른 패키지에는 호출할 수 없다.
	public void tiger() {
		System.out.println("무서운 호랑이");
	}
	protected void giraffe() {
		System.out.println("목이 긴 기린");
	}
	void elephant() {
		System.out.println("뚱뚱한 코끼리");
	}
	private void lion() {
		System.out.println("멋진 사자");
	}
}

 

 

[com.safari 패키지에 Safari class]

package com.safari;

import com.zoo.Zoo;
public class Safari extends Zoo {

	public static void main(String[] args) {
		Zoo zoo = new Zoo();
		zoo.tiger();
//		zoo.giraffe(); // protected - 다른 패키지 가능
		// 자식꺼로 생성해야 상속 받은 자식이라는 것을 알수 있다.
		
//		zoo.elephant(); // default 다른 패키지 불가/ 다른 패키지 상속관계 불가
//		zoo.lion();
		
		Safari safari = new Safari();
		safari.tiger();
		safari.giraffe();
//		safari.elephant(); //다른 패키지 상속관계 불가
//		safari.lion();
	}
}

Zoo class를 Safari class 에 상속한다.

Safari extends Zoo 

 

Zoo클래스의 tiger() 호출하기

Zoo zoo = new Zoo();
zoo.tiger();

 

protected로 선언된 giraffe는 다른 패키지라도 상속된 클래스일 경우 가능하다.

하지만, 객체가 부모객체로 선언되어 있어서 상속 관계인지 알수 없기 때문에 error가 발생한다.

zoo.giraffe();

 

default , private 는 다른 패키지에서는 호출이 불가능하다.
zoo.elephant();
zoo.lion();


Super class(Zoo)가 아니라 Sub class(Safari)로 객체를 생성해도 상속 관계이기 때문에 Super class인 Zoo class에 있는 메소드를 호출할 수 있다.

Safari safari = new Safari();
safari.tiger();

 

상속받은 관계라는 것을 알 수 있기 때문에 protected로 선언된 giraffe() 메소드도 호출이 가능하다.

safari.giraffe();

 

default , private 는 다른 패키지에서는 호출이 불가능하다.

safari.elephant();
safari.lion();


Object

 

Java의 최상위 클래스

Java의 모든 클래스를 Object로 부터 상속 받는다.

extends Object라고 쓰지 않아도 자동으로 상속 부여가 된다.(즉, 생략 가능하다)

 

Object에서는 ==, equals()모두 참조값만으로 비교가된다.

단, String만이 equals()가 내용(문자열)을 비교할 수 있다.

 

class Object {
           public boolean equals(Object obj) {} // 참조값 비교
           public String toString() { } // 클래스@16진수
           public int hashCode(){ } // 10진수
}

 

class String extends Object{
           public boolean equals(Object obj) {} // 문자열 비교
           public String toString() { }  // 문자열
           public int hashCode(){ } 

}

 

hashCode()

 

표현 할 수 있는 문자열은 무한대이기 때문에 참조값(주소)을 10진수 표현을 다 할 수 없다.
int는 길이가 짧기 때문에 중간에 짤릴 수 있어 중복되게 나올 수 있다.

 


 

모든 클래스는 extends Object 가 생략된 것이다.

 

class Test (extends Object)
public class ObjectMain (extends Object) 

class Test{
}

public class ObjectMain{
	public static void main(String[] args) {
    }
}

 

 

Test class를 호출하면

Test test = new Test();
System.out.println(test);
System.out.println(test.toString());

 

클래스@16진수 로 Test class의 주소가 출력된다.

toString()은 생략 가능한 Object의 메소드이기 때문에 둘다 똑같은 출력값이 나온다.

 

 

String으로 문자열로 잡으면

String str = "apple";
System.out.println("객체 str = " + str);

 

주소가 아닌 문자열 그대로 출력이 된다.


 

==, equals()

 

String aa = new String("apple");
String bb = new String("apple");
System.out.println("aa==bb : " + (aa==bb));
System.out.println("aa.equals(bb) : " + aa.equals(bb));

 

== 주소값을 비교하고

equals()문자열 자체를 비교한다.

 

따라서, 실행결과는 아래와 같다.

false
true

 

 

 

Object class 객체 생성으로 최상위 클래스를 생성해서 호출할 경우

Object cc = new Object();
Object dd = new Object();
System.out.println("cc==dd : " + (cc==dd)); //주소
System.out.println("cc.equals(dd) : " + cc.equals(dd)); //주소비교
System.out.println();

 

==주소값을 비교하고

equals() 역시 주소값을 비교한다.

 

따라서 실행 결과는 아래와 같다.

false
false