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
'Java' 카테고리의 다른 글
Java, Iterator ( hasNext(), next(), remove() ) (0) | 2024.07.23 |
---|---|
Java, interface(is~a 관계) / 익명 inner class (1) | 2024.07.23 |
Java, Final(상수화) 란? / instanceof / 색(RGB) (0) | 2024.07.18 |
Java, 오늘 날짜와 시간 출력 / Date / SimpleDateFormat / Calendar (0) | 2024.07.17 |
Java, 추상 클래스 NumberFormat 이용하기 / DecimalFormat / getCurrencyInstance( 나라별로 숫자(돈) 표현 ) (0) | 2024.07.17 |