Strong Root


문제


출력 결과는 무엇일까요?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
 
    public static void main(String[] args) {
        String a = "CGun";
        String b = new String("CGun");
        String c = a;
        String d = b;
        
        a += " Good";
        b += " Good";
        
        System.out.println(c);
        System.out.println(d);
    }
}
cs











정답












해설


"java string immutable" 혹은 "java string 불변"


으로 검색해보시면 많은 정보를 얻으실 수 있습니다.



이유1: 객체 생성시 초기화 작업


일반 변수들의 경우, 생성자 없이 전역에서 바로 초기화를 해줘도 됩니다.


하지만 불가능해서 꼭 생성자에서 초기화를 해줘야하는 경우도 있습니다.


1
2
3
4
5
import java.io.FileInputStream;
 
public class FileHandler {
    private FileInputStream fis = new FileInputStream("\tmpFile");
}
cs


위 코드는 컴파일에러가 발생하며, 아래와 같이 수정해야 합니다.


1
2
3
4
5
6
7
8
9
10
import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
public class FileHandler {
    private FileInputStream fis;
    
    public FileHandler() throws FileNotFoundException {
        fis = new FileInputStream("\tmpFile");
    }
}
cs


new FileInputStream() 에서 FileNotFoundException 을 throw 하므로 받아줘야 하기 때문입니다.











이유2: 객체 생성시 필수입력값을 강제하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Human {
    private String name;
    private String nickName;
    private int age;
    
    public Human(String name) {
        this.name = name;
    }
 
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
cs


사람 객체를 생성시 name 을 필수입력 항목으로 강제하는 코드입니다.


그외  nickName 과 age 는 원하는 경우에 한해 set 함수로 입력할 수 있습니다.



문제


출력 결과는 무엇일까요?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test {
 
    public static void main(String[] args) {
        User a = new User("CGun"29);
        User b = new User("CGun"29);
        User c = a;
        
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(a.equals(b));
    }
 
    public static class User {
        private String name;
        private int age;
        
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
}
cs











정답







해설


위 소스코드를 자세히 보시면 User 클래스 안에 equals() 메서드가 없습니다.


근데 왜 컴파일 에러가 안날까요?



Java 에서 모든 클래스들은 기본적으로 Object 클래스를 상속받습니다.


extends Object 가 생략되었을 뿐입니다.


그리고 이 Object 클래스 안에 equals() 메서드가 존재하고 있으며, 소스코드는 아래와 같습니다.


네. 따라서 a.equals(b) 는  a == b 와 완전히 같습니다.


String.equals() 문제에 익숙한 분들을 향한 함정 문제였습니다.






참고


String.equals()







출처


GC - java.lang.Object

GC - java.lang.String



프라미스 (Promise) 란


비동기적으로 결과를 리턴하는 함수에 대한 비동기 프로그래밍 패턴의 일종이다.


(※ 매우 중요한 개념이므로 필히 익히시기를 추천합니다.)






A부터 Z까지 Promises 의 모든 것


http://www.html5rocks.com/ko/tutorials/es6/promises/


너무도 완벽한 글을 찾아서 본문 없이 그냥 위 링크로 대체합니다.




한편, 퀄리티가 이 정도로 좋은 글을 쓰는 사람은 어떤 사람인지 궁금해서 찾아보았습니다.



네... 그렇습니다. 구글러네요.


전공적인 깊은 이해는 물론이고 글솜씨와 전개방식도 완벽합니다.


존경합니다.