[F-Lab 모각코 챌린지 9일차] TIL

JeongheeKim·2023년 6월 9일

TIL

목록 보기
9/66

학습계획


  • 자바의 신 7장 읽고 정리 및 연습문제 풀기
  • HashCode 정리

Today I Learned


int [] lottoNumbers;
int lottoNumbers[];
  • 변수 선언 시 대괄호를 열고 닫음으로써 해당 변수가 배열이라는것을 정의한다.
  • 대괄호 안에는 아무것도 적지 않는다.
int [] lottoNumbers = new int[100];
int [] lottoNumbers;
lottoNumbers = new int[100];
  • 배열의 사이즈를 초기화 해줘야한다.
  • 배열의 위치는 0부터 시작한다.
  • 괄호안에 배열에 담을 값을 셋팅하여 초기화 할 수 있다. 하지만 배열 초기화 시 값을 셋팅하는 경우 배열의 값이 절대 변경되지 않는 값을 지정할때 사용하는것이 좋다.
    int [] lottoNumbers = {10,20,30,40};

기본 자료형 배열의 기본값은 각 자료형의 기본값과 동일하다.

  • 기본 자료형을 지역변수로 사용할 경우 무조건 초기화 해줘야하지만, 배열은 배열의 크기만 지정하면 상관없다.
    • char는 배열의 기본값이 \u0000이지만, 화면에 출력될때는 빈 공백문자열이다.
  • 참조자료형으로 배열의 타입으로 지정될 경우 기본값을 지정하지 않는다면 null이 셋팅된다.
    public class ArrayInitValue {
    	public static void main(String[] args) {
    		ArrayInitValue value = new ArrayInitValue();
    		value.referenceType();
    	}
    
    	public void referenceType() {
    		String[] strings = new String[2];
    		System.out.println("strings[0] = " + strings[0]);
    
    		ArrayInitValue[] arrayInitValues = new ArrayInitValue[2];
    		System.out.println("arrayInitValues[0] = " + arrayInitValues[0]);
    	}
    }
    strings[0] = null
    arrayInitValues[0] = null
  • JDK5부터 collection자료구조를 쉽게 for문을 돌 수 있게 개선된 for문이 등장했다.
    for(타입이름 임시변수명 : 반복대상객체) {
    }

정리해봅시다

  • 배열을 선언할 때 어떤 기호를 변수명의 앞이나 뒤에 사용해야 하나요?*
    • 대괄호를 사용해야한다. int [] lottoNumbers = new int[100];
  • 배열의 첫번째 위치는 0인가요? 1인가요?*
    • 0번째부터 시작한다.
  • 배열을 선언할 때 boolean 배열의 크기만 지정했다면 boolean 배열의 [0] 위치에 있는 값은 무엇인가요?*
    • boolean의 기본값 false가 들어간다.
  • ArrayIndexOutOfBoundsException 이라는 것은 언제 발생하나요?*
    • 배열의 사이즈 범위보다 벗어난 배열의 값을 호출할때 발생한다.
  • 중괄호를 이용하여 배열을 초기화 할 때 중괄호 끝에 반드시 어떤 것을 입력해 주어야 하나요?*
    • 세미콜론을 붙여야 한다. int [] lottoNumbers = {10,20,30,40};
  • 2차원 배열을 정의할 때에는 대괄호를 몇 개 지정해야 하나요?*
    • 2차원 배열 정의 시 대괄호를 두개 붙여야한다. int towDim[][];
  • 배열을 쉽게 처리해주는 for 문의 문법은 어떻게 되나요?* for문의 중간 조건문에 배열의 길이를 넣어 배열의 길이만큼 for문이 돌도록한다.
    for(int oneLoop = 0; oneLoop<twoDim.length; oneLoop++ {
    
    }
  • 자바 프로그램에 데이터를 전달해 주려면 클래스 이름 뒤에 어떻게 구분하여 나열하면 되나요?
    • 클래스 이름 뒤에 공백으로 구분하여 실행한다.
  • 자바 프로그램이 시작할 때 전달 받는 내용은 어떤 타입의 배열인가요?
    • String타입의 배열을 전달받는다.

직접해봅시다

public class ManageHeight {
	static int [][] gradeHeights;
	public static void main(String[] args) {
		ManageHeight manager = new ManageHeight();
		manager.setData();

		for(int i=0;i<5;i++) {
			System.out.println("Class No.:"+i+1);
			printHeight(i);
			manager.printAverage(i);
		}
	}

	public void setData() {
		gradeHeights = new int[][]{
			{170, 180, 173, 175, 177},
			{160, 165, 167, 186},
			{158, 177, 187, 176},
			{173, 182, 181},
			{170, 180, 165, 177, 172}
		};
	}

	public static void printHeight(int classNo) {
		for (int data:gradeHeights[classNo]) {
			System.out.println(data);
		}
	}

	public void printAverage(int classNo) {
		double ave = 0.0;
		for(int data:gradeHeights[classNo]) {
			ave += data;
		}
		ave = ave/gradeHeights[classNo].length;
		System.out.println(ave);
	}
}

HashMap은 내부적으로 배열을 사용합니다. hashCode 메소드가 객체의 해시 코드를 반환하며, 이를 인덱스로 사용해 배열에 값을 저장합니다. 이렇게 함으로써 객체를 검색할 때 매번 모든 값을 비교하는 것이 아니라 해당 인덱스에 저장된 값을 바로 찾을 수 있게 됩니다.

❓hashCode 메소드를 구현할 때 필요한 조건에는 어떤 것들이 있고, 이를 어떻게 충족해야하나요?

  • 객체가 수정되지 않는한, hashCode()메서드를 호출한 값은 매번 동일한 integer값을 리턴한다.
  • equals() 로 true가 나오면 hashCdoe()도 동일한 결과를 내야한다.
  • equals() 로 false가 나오면 hashCdoe()가 동일 할 수 도 있고 동일하지 않을 수 있다.

hashMap에 객체가 저장될 경우 객체마다 hashCode가 부여되는데, 이 hashCode는 list형태의 bucket에 저장된다. hashcode() 메서드 값이 같으면, bucket에 동일한 여러값이 들어갈 수 있다.

만약 hashMap에서 get() 메서드로 호출 시 여러개의 객체가 리턴될 경우 equasl()메서드를 통해 같은 값인지 비교해서 값을 리턴한다.

  • hashcode를 Overriding시 java에서 따라야하는 규칙 명시
    1. 자바 어플리케이션이 수행되는 동안에 어떤 객체에 대해서 이 메소드가 호출될때에는 항상 동일한 int값을 리턴해 주야아한다. 하지만 자바를 실행할 때마다 같은 값일 필요는 없다.
    2. 두 객체를 equals로 비교한 결과가 true인 경우 hascode로 비교 시 동일한 int 값이 나와야한다.
    3. 두 객체를 equals() 메소드를 사용하여 비교한 결과 false를 리턴했다고 해서 hashcode메소드를 호출한 int값이 무조건 달라야 할 필요는 없다. 하지만 서로 다른 int값을 제공하면 hashtable의 성능을 향상시키는데 도움이 된다.
  • HashMap의 구현은 hashtable의 규칙을 기반으로 한다.

  • HashMap의 key(hashCode)-value쌍은 bucket이라고 불리는 내부 배열구조에 저장된다.

(hashMap의 키값이 hashcode인것을 명시)

  • hashCode는 bucket 배열의 인덱스에 매핑된다. 다양한 키들은 동일한 bucket배열의 인덱스에 매핑될 수 있다.

0개의 댓글