๐Ÿ“•JAVA

[JAVA] Object ํด๋ž˜์Šค

๋น™๋””์šฉ 2024. 4. 18.

1. java.lang ํŒจํ‚ค์ง€

- ์ž๋ฐ”๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฒƒ๋“ค์˜ ๋ชจ์Œ

- jaba.lang ํŒจํ‚ค์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž๋™ ์ž„ํฌํŠธ ๋˜๋ฏ€๋กœ ์ž„ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

* java.lang  ํŒจํ‚ค์ง€ ์†Œ๊ฐœ

- Object : ๋ชจ๋“  ์ž๋ฐ” ๊ฐ์ฒด์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค

- String : ๋ฌธ์ž์—ด

- Integer, Long, Double : ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ์ฒด๋กœ ๋งŒ๋“  ๊ฒƒ

- Class : ํด๋ž˜์Šค ๋ฉ”ํƒ€ ์ •๋ณด

- System : ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณต

2. Object ํด๋ž˜์Šค

- ์ž๋ฐ”์—์„œ ๋ชจ๋“  ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ํด๋ž˜์Šค๋Š” ํ•ญ์ƒ Object ํด๋ž˜์Šค์ด๋‹ค.

- ํด๋ž˜์Šค์—์„œ ์ƒ์† ๋ฐ›์€ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์—†๋‹ค๋ฉด ๋ฌต์‹œ์ ์œผ๋กœ Object ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋‹ค.

1) Object ํด๋ž˜์Šค๊ฐ€ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ ์ด์œ 

* ๊ณตํ†ต ๊ธฐ๋Šฅ ์ œ๊ณต

- toString(), eqals(), getClass() ๋“ฑ...

 

* ๋‹คํ˜•์„ฑ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„

- Object ๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์ด๋ฏ€๋กœ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- Object ํด๋ž˜์Šค๋Š” ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ž๋ฐ” ๊ฐ์ฒด๋Š” Object ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

- Object ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋‹ค ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ ์–ด๋”˜๊ฐ€์— ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Object ์— ๋ณด๊ด€ํ•˜๋ฉด ๋œ๋‹ค.

2) Object์˜ ๋‹คํ˜•์„ฑ

 *์žฅ์ 

    - ์–ด๋–ค ๊ฐ์ฒด๋“ ์ง€ ์ธ์ž๋กœ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

* ํ•œ๊ณ„

    - ์ž์‹ํด๋ž˜์Šค๋ฅผ Object๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      Object ์•ˆ์—๋Š” ์ž์‹ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ. 

    - Object๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์šด์บ์ŠคํŒ…์„ ์ง„ํ–‰ํ•˜์—ฌ์•ผํ•œ๋‹ค.

 

- ๋‹คํ˜•์„ฑ์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹คํ˜•์  ์ฐธ์กฐ + ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•จ๊ผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

3) Object์˜ ๋ฐฐ์—ด

- Object๋Š” ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Object[]๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

class Dog {
	private void sound(){
    	system.out.println("๋ฉ๋ฉ);
}

class Car {
	private void car(){
    	system.out.println("์ด๋™");
	}

public class ObjectPolyExample {
	public static void main(String[] args) {
		Dog dog = new Dog();
		Car car = new Car();
        
		Object object = new Object();
		Object[] objects = {dog, car, object};
		size(objects);
	}
	private static void size(Object[] object) {
		System.out.println("์ „๋‹ฌ๋œ ๊ฐ์ฒด์˜ ์ˆ˜๋Š” : " + object.length); // 3
	}
}

*

3. toString 

- ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

public class ObjectPolyExample {
	public static void main(String[] args) {
		Object object = new Object();
		String string = object.toString();
        
        system.out.println(string); //java.lang.Object@a38d7a3
        system.out.println(object); //java.lang.Object@a38d7a3
	}

}

 - toString์€ getClass().getName(), hashCode(๊ฐ์ฒด์˜ ์ฐธ๊ณ ๊ฐ’)์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ œ๊ณตํ•จ.

- println() ๋ฉ”์„œ๋“œ ์•ˆ์— toString()์„ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

1) toString() ์˜ค๋ฒ„๋ผ์ด๋”ฉ

- toString()์˜ ์ •๋ณด๋งŒ์œผ๋กœ๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์žฌ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋”ฉ)ํ•ด์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

public class Dog {
	private String dogName;
	private int age;
	
	public Dog(String dogName, int age) {
		this.dogName = dogName;
		this.age = age;
	}

	@Override //java ๊ธฐ๋ณธ๊ธฐ๋Šฅ ์‚ฌ์šฉ
	public String toString() {
		return "Dog [dogName=" + dogName + ", age=" + age + "]";
	}
}

- ์ž๋ฐ”์˜ ๊ธฐ๋ณธ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด toString ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ฐ”๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- ์ด๋ฏธ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š”

String refValue = Integer.System.identitHashCode();

 ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

3. Object ์™€ OCP

 1) OCP ์›์น™

- Open : ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

- Close : ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ Object์™€ toString()์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

- ๋‹คํ˜•์  ์ฐธ์กฐ, ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ๋ชจ๋‘ ์ถ”์ƒ์ ์ธ Object์— ์˜์กดํ•˜๋ฉด์„œ OCP์›์น™์„ ์ง€ํ‚จ๋‹ค.

2) System.out.println()

- Object ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ด๋ถ€์—์„œ toString()์„ ํ˜ธ์ถœํ•œ๋‹ค.

- ์ฆ‰ System.out.println()์„ ํ†ตํ•ด ์„ธ์ƒ์˜ ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

4. equals()

1) ๋™์ผ์„ฑ๊ณผ ๋™๋“ฑ์„ฑ

* ์ž๋ฐ”์—์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ 2๊ฐ€์ง€๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

    - ๋™์ผ์„ฑ(Identity) : == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‘ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ (์ฐธ์กฐ๊ฐ’ ์ž์ฒด๋ฅผ ํ™•์ธ)

    - ๋™๋“ฑ์„ฑ(Eqality) :  .equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™๋“ฑํ•œ์ง€ ํ™•์ธ

public class User {
	private String id;
    
    public User(String id){
    	this.id = id;
	}
}
public class EqualsName {

		public static void(String[] args) {
        	User user1 = new User("id-100");  //์ฐธ์กฐ๊ฐ’ : x001
            User user2 = new User("id-100");  //์ฐธ์กฐ๊ฐ’ : x002
            
            System.out.println(user1 == user2); //false, ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ
            System.out.println(user1.equals(user2);// false
	}
}

 

- equals() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ false๊ฐ€ ๋‚˜์˜ค๋Š” ์ด์œ ๋Š” Object๊ฐ€ ์ œ๊ณตํ•˜๋Š” equals()๋Š” == ์œผ๋กœ ๋™์ผ์„ฑ ๋น„๊ต๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

//Object class์˜ equals()
public boolean equals(Object obj) {
	return (this == obj);
}

- ๋™๋“ฑ์„ฑ์ด๋ผ๋Š” ๊ฐœ๋…์€ ๊ฐ๊ฐ€์˜ ํด๋ž˜์Šค ๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ.

- ๋•Œ๋ฌธ์— ๋™๋“ฑ์„ฑ ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด equals() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

- IDE์˜ ๊ธฐ๋ณธ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค. 

public class User {
	private String id;
    
    public User(String id){
    	this.id = id;
	}
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        Dog other = (Dog) obj;
        return Objects.equals(id, other.id);
    }
}

 

* equals() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ทœ์น™ (IDE๊ฐ€ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํ•˜๊ฒŒ ์•Œ ํ•„์š” X)

    - ๋ฐ˜์‚ฌ์„ฑ(Reflexivity) : ๊ฐ์ฒด๋Š” ์ž๊ธฐ ์ž์‹ ๊ณผ ๋™๋“ฑํ•ด์•ผ ํ•œ๋‹ค. ( `x.equals(x)` ๋Š” ํ•ญ์ƒ `true` ).
    - ๋Œ€์นญ์„ฑ(Symmetry): ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ์— ๋Œ€ํ•ด ๋™์ผํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด, ์ด๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
       ( `x.equals(y)` ๊ฐ€ `true` ์ด๋ฉด `y.equals(x)` ๋„ `true` ).
    - ์ถ”์ด์„ฑ(Transitivity) : ๋งŒ์•ฝ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ๋™์ผํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๊ฐ€ ์„ธ ๋ฒˆ์งธ ๊ฐ์ฒด์™€ ๋™์ผํ•˜๋‹ค๋ฉด, ์ฒซ๋ฒˆ์งธ ๊ฐ

       ์ฒด๋Š” ์„ธ ๋ฒˆ์งธ ๊ฐ์ฒด์™€๋„ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
    - ์ผ๊ด€์„ฑ(Consistency) : ๋‘ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ, `equals()` ๋ฉ”์†Œ๋“œ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
    - null์— ๋Œ€ํ•œ ๋น„๊ต : ๋ชจ๋“  ๊ฐ์ฒด๋Š” `null` ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ `false` ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

์ฐธ๊ณ  : ๊น€์˜ํ•œ์˜ ์‹ค์ „ ์ž๋ฐ”-์ค‘๊ธ‰1ํŽธ

๋Œ“๊ธ€