인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

28026님의 프로필 이미지
28026

작성한 질문수

(2025) 일주일만에 합격하는 정보처리기사 실기

같지만 다른 것들

같지만 다른것들

해결된 질문

작성

·

120

0

java에서

string " " 에 들어가는 문자열이 같을 경우에

같은 메모리에 들어가기 때문에

str1 = "a", str2 = "a" 의 a 값이 같은 거라고 하셨습니다.

그리고 int의 경우 -128~127까지의 경우도 동일하고요.

그런데 같지만 다른 것들 8:37에서 문제풀이 하실 때

person1 == person.2 : false인 이유를 모르겠습니다.

따옴표안의 stirng인 "John"이고, 25의 int형 변수인데요.

true가 나와야 하지 않나요?

답변 1

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

안녕하세요.

우선 답변을 달기 전에 노파심에 한가지 지적은 아니고, 보완의 말씀 드립니다. (혹시라도 다르게 외우셨을까봐)

"int"와 "Integer"는 다릅니다. 같지만 다른 것들 챕터는 Integer와 같은 래퍼클래스(Wrapper Class)라는 종류를 설명드리는 챕터라고 꼭 기억 부탁드립니다.



이게 참 외우기가 어려운데(변수와 메모리 공간을 생각해야하니), 반대로 다르게 생각하면 쉽습니다.

"문자열만" 변수로 들어가는 것은 문자열 풀이라는 곳에 저장됩니다. (string pool)

 

그런데, 클래스에서 파생된 객체는 그냥 그 자체로 다른 공간에 저장됩니다.

제가 8:30에 말로 설명한 것처럼

이름과 나이가 같다고 해서 같은 사람은 아닙니다. 현실에서 쌍둥이도 같은 사람이 아닌 것처럼요.

 

일단 new로 태어나는 객체는 다 다른 공간에 있다고 생각하셔야 합니다. 하지만! 이름만 딱 꺼내서 equal로 비교하면 문자값 자체는 같으니 true가 나오겠죠.

 

그렇다면 객체를 비교하면서 == 했을 때 true가 나오는 케이스가 있을까요?

네 있습니다. 이렇게 시험에 나오는 경우에는 같습니다.

class Person {
    String name;
    int age;


    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        
        Person person1 = new Person("John", 25);

        
        Person person2 = person1;

        
        if (person1 == person2) {
            System.out.println("same");
        } else {
            System.out.println("different");
        }
    }
}

 

위의 출력값은 same이 됩니다. 왜냐하면 애초에 person2라는 객체는 person1을 가리키라고 지시했기 때문입니다. (Person person2 = person1;)

 

이런 경우를 제외하고 new로 객체를 태어나게 하는 경우에는 아예 다른 공간에 있다고 생각하셔야 합니다.

 

이해에 도움이 되셨을까요?

 

28026님의 프로필 이미지
28026

작성한 질문수

질문하기