[F-lab 모각코 챌린지 12일차] TIL

JeongheeKim·2023년 6월 12일

TIL

목록 보기
12/66
post-thumbnail

학습계획


  • 자바의 신 9장 읽고 연습문제 풀기
  • hashCode() 질문 보완하기

Today I Learned


패키지

  • 자바는 해당 패키지의 가장 상위 디렉터리에서 실행해야한다는 규칙이 있다.
  • 패키지의 규칙을 따르지 않으면 컴파일 되지않는다.
    • 패키지 문은 코드의 가장 첫줄에 있어야 하며, 하나만 존재해야 한다.
    • 패키지의 위치와 소스코드가 있는 위치가 동일해야한다.
    • 패키지 명은 java로 시작하면 안된다.
    • 자바의예약어를 사용하면 안되고, 소문자로 지정해야한다.

import를 이용하여 다른 패키지에 접근하기

  • 클래스에서 같은 패키지에있는 클래스, java.lang패키지에 있는 클래스만 사용할 수 있다.
  • java.lang패키지는 자바프로그래밍 설계의 기본적인 기능을 제공하는 클래스의 모임이다.

    Package java.lang

    Provides classes that are fundamental to the design of the Java programming language.

    String, StringBuffer
    Process, Runtime, Thread
    Math, StrictMath
    Exception Throwable, Error
    Package, Class, ClassLoader
    Wrapper, System, Stream
    • java.lang패키지, 같은 패키지는 따로 import문을 설정하지 않아도 호출된다.

접근제어자

클래스, 메소드, 인스턴스 및 클래스 변수를 사용할때 사용한다.

패키지는 서로 연관되어서 작동하는 일련의 클래스로 구성된다. 같은 패키지에 있는 클래스끼리는 서로 다른 클래스에 있는 코드를 접근 할 수 있도록 하고 외부에서는 일부 클래스,메소드만 사용할 수있도록 하게 하기 위해 접근제어자를 쓴다.

  • public
    • 누구나 접근 가능
    • 클래스 생성 시 기본 제어자가 public이다. 기본 설정으로 클래스를 어디서나 객체를 생성할 수 있도록 만든것이 아닐까 한다.
    • getter, setter
  • protected
    • 같은 패키지 내에 있거나 상속 받은 경우만 접근 가능
    • 하위 클래스가 상위클래스가 속해있는 패키지와 다른 패키지에 들어있어도 메소드나 생성자와 같은 클래스 안에 있는것을 상속할 수 있게 한다.
  • package-private
    • default접근 제어자이며 적어주지 않았을 경우.
    • 같은 패키지 내에 있을때만 접근이 가능하다.
  • private
    • 해당 클래스 내에서만 접근 가능
    • 인스턴스 변수, 외부에서 호출하면 안되는 메소드

클래스 접근 제어자 선언 시 유의점

반드시 파일 이름에 해당하는 클래스가 반드시 존재해야한다.

public으로 선언된 클래스가 소스내에 있다면, 그 소스파일의 이름은 public인 클래스 이름과 동일해야한다.

정리해봅시다.

  • 패키지를 선언할 때 사용하는 예약어는 무엇인가요?
    • package
  • 패키지 선언은 클래스 소스 중 어디에 위치해야 하나요?
    • 코드 제일 위에 존재해야한다.
  • 패키지를 선언할 때 가장 상위 패키지의 이름으로 절대 사용하면 안되는 단어는 무엇인가요?
    • java
  • 패키지 이름에 예약어가 포함되어도 되나요?
    • 아니오
  • import는 클래스 내에 선언해도 되나요?
    • 아니오. 패키지 선언 및 클래스 선언 위에 선언해야한다.
  • 같은 패키지에 있는 클래스를 사용할 때 import를 해야 하나요?
    • 같은 패키지내의 클래스는 따로 import하지 않아도 된다.
  • 특정 패키지에 있는 클래스들을 모두 import할 때 사용하는 기호는 무엇인가요?
      • 를 사용하여 해당 패키지 안에 모든 클래스를 호출 할 수 있다.
  • 클래스에 선언되어 있는 static한 메소드나 변수를 import하려면 어떻게 선언해야 하나요?
    • import static으로 선언한다.
  • 접근 제어자 중 가장 접근 권한이 넓은 (어떤 클래스에서도 접근할 수 있는) 것은 무엇인가요?
    • public
  • 접근 제어자 중 가장 접근 권한이 좁은 (다른 클래스에서는 접근할 수 없는) 것은 무엇인가요?
    • private
  • 접근 제어자 중 같은 패키지와 상속관계에 있는 클래스만 접근할 수 있도록 제한하는 것은 무엇인가요?
    • protected
  • Calculate.java라는 자바 소스가 있을 경우, 그 소스 내에는 Calculate라는 클래스외에는 (     )으로 선언된 클래스가 있으면 안된다. 여기서 괄호 안에 들어가야 하는 것은 무엇인가요?
    • public

Q2. hashcode는 equals나 동등연산시 사용될까?

equals()로 메소드 연산 시 비교되는 참조변수는 객체의 번지를 전달하므로 hashCode는 사용되지 않는다. equals()내부는 동일하게 동등연산(==)을 사용하므로 둘다 hashCode를 사용하지 않는다.

  • equals()와 동등연산에서 hashCode가 사용된다고 오해했던 이유

    hashCode는 equals,동등연산시 동일하게 사용된다고 생각했다. 
    ![](https://velog.velcdn.com/images/8055kjh/post/ab80d70b-0c71-420c-884b-eb5a1ee24860/image.png)
    
    
    equals연산 시 전달되는 매개변수는 `toString()`값처럼 나와서 toString() 메서드가 사용된다고 생각했다.(객체명.toString()하지 않아도 객체 이름만 출력할 경우 `toString()`을 컴파일러가 자동으로 붙여 컴파일 하기 때문이다.) `toString()` 메서드를 보면 `클래스 타입 이름 @ 객체주소 해시코드`로 구성되어 hashCode()가 사용된다고 생각했다.
    
    ![](https://velog.velcdn.com/images/8055kjh/post/8840ec13-a116-4629-a2da-2c0a5a705eb8/image.png)

IntelliJ에서 디버깅할 때, 객체를 변수로 표시하면 기본적으로 해당 객체의 toString() 메서드가 호출되어 결과값이 나타난다고 한다. 참조변수는 객체의 번지를 가르키지 toString()값은 디버깅하는데 도움이 되도록 사용되는것임을 오해하지 말자.

0개의 댓글