부트캠프 온보딩 강의

1. 생각, 표현, 코딩하기

   (1) 주어진 문제를 컴퓨팅적 사고로 생각하고 -> 그림으로 표현하고 -> 코딩으로 옮기기

 

2. 자바 개발환경 구축하기

   (1) JDK, IntelliJ를 다운받아 자바 개발환경 구축

   (2) JDK는 Java기반 데스크톱 앱을 개발하기 위해서 다운로드가 필요하다

 

3. 첫 자바 프로그래밍 도전하기

   (1) .java 파일을 -> JDK의 javac가 컴파일해서 바이트코드로 된 .class파일을 만든다 -> 이후 JDK의 java가 JVM을 동작시켜서 .class파일을 실행한다

   (2) JVM은 바이트코드로 된 .class파일을 해당 운영체제에 맞는 .exe(실행파일)로 변환해서 실행한다

   (3) 그래서 컴파일 된 .class파일과 운영체제에 맞는 JVM만 있으면, 운영체제에 독립적으로 어디에서 실행할 수 있다

 

4. 이것만 알자! 프로그래밍 3대 요소

   (1) 변수, 자료형, 할당

   (2) 자료형 + 변수명으로 변수를 선언한 후, 변수에 데이터를 할당한다 -> 이것이 프로그래밍 3대 요소

   (3) 변수명은 규칙에 따라 작성해야 함(숫자로 시작X, 이미 정의된 문자 사용X)

   (4) 자료형에는 기본자료형과 사용자정의 자료형이 존재

   (5) 지역변수는 꼭 초기화가 되어야함. 그렇지 않고 연산을 했을 시 컴파일 오류(초기화를 해주세요)가 남

   (6) 변수가 만들어지면 변수를 관리하는 '심볼 테이블'에 저장이 된다

   (7) 심볼 테이블은 key로 변수명을 value로 메모리의 주소를 갖고 있다

   (8) 그래서 변수가 만들어지면 key에 변수명, value에 메모리 주소가 생성되고 이후에 변수를 찾아갈 때 심볼 테이블에서 메모리 주소를 찾고 그 주소로 찾아간다

   (9) 선언되지 않은 변수(c = 100;)을 하면 IDE에서 'cannot resolve symbol 'c''가 나오는데 이 컴파일 오류의 뜻이 심볼 테이블에서 변수를 찾을 수 없다는 뜻이다


이펙티브 자바 - 아이템 10 : equals는 일반 규약을 지켜 재정의하라

- equals는 재정의하기 쉬워보이지만 곳곳에 함정이 있음. 아래와 같은 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선임

   ① 각 인스턴스가 본질적으로 고유하다

   ② 인스턴스의 논리적 동치성을 검사할 일이 없다

   ③ 상위 클래스에서 재정의한 equals가 하위에서도 딱 들어맞는다

   ④ equals 메서드를 호출할 일이 없다

   -> 이럴 경우 equals는 재정의하지 말아라

- 그렇다면 재정의 해야할 때는 언제야? 

- 객체를 무리적으로 같은지가 아니라 논리적으로 같은지를 확인해야하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때

- 예를 들어 Integer나 String처럼 값 클래스들이 여기에 해당함(우리는 값을 비교하고 싶기 때문)

- equals를 재정의할 때는 아래와 같은 규약을 지켜야 함 (x,y,z는 모두 null이 아님)

   ① 반사성 : x.equals(x)는 true

   ② 대칭성 : x.equals(y)가 true이면 y.equals(x)도 true여야 함

   ③ 추이성 : x.equals(y)가 true이고 y.equals(z)가 true이면 x.equals(z)도 true여야 함

   ④ 일관성 : x.equals(y)를 반복해서 호출했을 때 항상 같은 값이 나와야함

   ⑤ null 아님 : x.equals(null)은 항상 false임

- 이제 하나씩 알아보자

- 반사성 

   ① 자기 자신과 같아야 한다 -> 규약을 따르기 쉽다

- 대칭성

   ① 서로에 대한 동치 여부에 똑같이 답해야 한다

   ② 예를 들어 CaseInsensitiveString이 String과도 비교를 할 수 있도록 재정의하면, cis.equals(str)은 true가 나올 수 있지만 str.equals(cis)는 false가 나와서 대칭성에 위반된다

   ③ 그러므로 CaseInsensitiveString은 자신과 같은 instance들하고만 비교해야 한다

- 추이성

   ① Point(x,y)가 있고 Point를 상속한 ColorPoint(x,y,color)가 있다고 하자

   ② 이 때 Point는 같은 instance인지와 x,y 값을 비교하고 ColorPoint는 같은 instance와 x,y,color 값을 비교할 때, p.equals(cp)는 true일 수 있지만 cp.equals(p)는 false가 된다(대칭성 위반)

   ③ 이렇게 구체클래스를 확장하면서 새로운 값을 추가할 때 equals 규약을 만족시킬 방법은 존재하지 않음

   ④ 그래서, 상속 대신 컴포지션 방법을 사용할 수 있다(ColorPoint(Point, color)로 만드는 방법)

- 일관성

   ① 두 객체가 같다면 수정되지 않는한 영원히 같아야 함

   ② 불변객체는 한번 다르면 끝ㄴ까지 달라야 하므로, 불변 클래서로 만드는게 나을지 고민해보자

- null 아님

   ① null이 아닌 객체는 null과 같지 않아야 함

   ② 굳이 null을 검사할 필요 없이 instanceof로 검사하면 null인지 자동으로 체크 된다

- 위의 방법을 종합해서 양질의 equals 메서드 구현 방법을 정리

   ① == 을 이용해 자기 자신의 참조인지 확인하자. 성능 최적화용임

   ② instanceof 연산자로 입력이 올바른 타입인지 확인

   ③ 올바른 타입으로 형변환

   ④ 핵심 필드들이 일치하는지 하나씩 검사

- 아래는 좋은 equals 예시

@Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Car)) {
            return false;
        }
        Car car = (Car)o;
        return car.number == number && car.name==name;
    }

- 마지막 주의사항

   ① equals를 재정의할 때는 hashCode도 반드시 재정의하자

   ② Object외에 타입을 매개변수로 받는 equals 메서드는 선언하지 말자

- 꼭 필요한 경우가 아니라면 equals를 재정의하지 말자. 재정의해야할 때는 규약을 지키고 핵심 필드들을 모두 빠짐없이 비교하자


해야할 것이 늘었다. 스프링 강의, 부트캠프 온보딩 강의, 이펙티브 자바, 면접질문 정리를 기본으로 하고 시간이 남으면 코테 문제를 풀도록 하자. 쪼금 벅차지만 열심히 해보자!!!

'TIL(Today I Learned)' 카테고리의 다른 글

2023.07.07  (0) 2023.07.07
2023.07.06  (0) 2023.07.06
2023.07.04  (0) 2023.07.04
2023.07.03  (0) 2023.07.03
2023.06.30  (0) 2023.06.30

+ Recent posts