내배캠 사전캠프 TIL 20일차

오병택·2025년 2월 13일

내배캠

목록 보기
21/73

학습 요약

자바 강의, 코테 문제

코테

프로그래머스 level 1 K번째수

문제 설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

import java.util.Arrays;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int [commands.length];
        for (int i=0; i<commands.length; i++) {
            int[] n=Arrays.copyOfRange(array,commands[i][0]-1,commands[i][1]);
            Arrays.sort(n);
            answer[i]=n[commands[i][2]-1];
        }
        return answer;
    }
}

오늘은 별로 안 걸렸다. 크게 모르는 부분이 없어서

JAVA 강의

throws: 메서드에서 특정 예외가 발생할 가능성이 있음을 선언할 때 사용

예외 선언 기본 구조(throws)

반환타입 메서드명(매개변수) throws 예외클래스 {
    // 예외 발생 가능성이 있는 코드
}

예외 처리를 어디에서 하면 좋을 지를 생각하며 코드를 짜는 것이 좋음.

finally블럭: 예외 발생여부와 상관없이 수행돼야 하는 코드

try-catch-finally 기본 구조

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (예외클래스 변수명) {
    // 예외 처리 코드
} finally {
    // 항상 실행되는 코드 (생략 가능)
}

사용자 정의 예외 만들기

-상속을 통해 우리가 직접 예외 클래스를 정의할 수 있음
-조상은 Exception과 RuntimeException 중에서 선택

class MyException extends Exception {
	MyException(String msg) { // 예외 메시지 초기화
		super(msg);
	}
}

point: 1. 조상 선택 2. String 매개변수가 있는 생성자 넣기

자바에서 예외는 모두 Throwable 클래스를 상속하는 클래스 계층 구조를 가짐

예외 되던지기

-예외를 처리한 후에 다시 예외를 발생시키는 것
-호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
ex)

class Ex8_12 {
	public static void main(String[] args) {
		try  {
			method1();		
		} catch (Exception e)	{
			System.out.println("main메서드에서 예외가 처리되었습니다.");
		}
	}	// main메서드의 끝

	static void method1() throws Exception {
		try {
			throw new Exception();
		} catch (Exception e) {
			System.out.println("method1메서드에서 예외가 처리되었습니다.");
			throw e;			// 다시 예외를 발생시킨다.
		}
	}	// method1메서드의 끝
}

연결된 예외

-한 예외가 다른 예외를 발생시킬 수 있음
-예외 A가 예외 B를 발생시키면, A는 B의 원인 예외

사용하는 이유:
-여러 예외를 하나로 묶어서 다루기 위해서
-checked예외를 unchecked예외로 변경할 때

위의 두 가지 이유를 설명해주는 예제

class Ex8_13 {
	public static void main(String args[]) {
		try {
			install();
		} catch(InstallException e) {
			e.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();		
		}
	} // main의 끝

	static void install() throws InstallException {
		try {
			startInstall();		// 프로그램 설치에 필요한 준비를 한다.
			copyFiles();		// 파일들을 복사한다. 
		} catch (SpaceException2 e)	{
			InstallException ie = new InstallException("설치 중 예외발생");
			ie.initCause(e);
			throw ie;
		} catch (MemoryException2 me) {
			InstallException ie = new InstallException("설치 중 예외발생");
			ie.initCause(me);
			throw ie;                         // 이 부분을 unchecked로 바꿀 경우 catch문 작성 안해도 됨.
		} finally {
			deleteTempFiles();		// 프로그램 설치에 사용된 임시파일들을 삭제한다.
		} // try의 끝
	}

	static void startInstall() throws SpaceException2, MemoryException2 { 
		if(!enoughSpace()) { 		// 충분한 설치 공간이 없으면...
			throw new SpaceException2("설치할 공간이 부족합니다.");
		}

		if (!enoughMemory()) {	// 충분한 메모리가 없으면...
			throw new MemoryException2("메모리가 부족합니다.");
         // throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
         // checked예외에서 unchecked예외로 바꿀 때 위의 throws 선언에서 MemoryException2를 지우고 
         바로 위의 주석으로도 원인 예외 연결 가능
		}
	} // startInstall메서드의 끝

   static void copyFiles()       { /* 파일들을 복사하는 코드를 적는다.   */ }
   static void deleteTempFiles() { /* 임시파일들을 삭제하는 코드를 적는다.*/ }
   
   static boolean enoughSpace() {
		// 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다.
		return false;
   }
   static boolean enoughMemory() {
		// 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다.
		return true;
   }
} // ExceptionTest클래스의 끝

class InstallException extends Exception {
	InstallException(String msg) {
	   super(msg);	
   }
} 

class SpaceException2 extends Exception {
	SpaceException2(String msg) {
	   super(msg);	
   }
} 

class MemoryException2 extends Exception {
	MemoryException2(String msg) {
	   super(msg);	
   }
}

Throwable initCause(Throwable cause) // 지정한 예외를 원인 예외로 등록
Throwable getCause() // 원인 예외를 반환

Object 클래스:

-모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있음.
-notify(), wait() 등은 쓰레드와 관련된 메서드

equals(Object obj):

-객체 자신(this)와 주어진 객체(obj)를 비교. 같으면 true, 다르면 false
-Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)

Object 클래스의 equals() 기본 구조

public boolean equals(Object obj) {
	return (this==obj);
}

equals(Object obj)의 오버라이딩:
-인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 함.
ex)

class Person {
	long id;

	public boolean equals(Object obj) {
		if(obj instanceof Person)
			return id ==((Person)obj).id; // obj는 Object 타입이므로 id값이 없기 때문에 형변환 해줘야 함.
		else
			return false;
	}
	Person(long id) {
		this.id = id;
	}
}

class Ex9_2 {
	public static void main(String[] args) {
		Person p1 = new Person(8011081111222L);
		Person p2 = new Person(8011081111222L);

		if(p1.equals(p2))
			System.out.println("p1과 p2는 같은 사람입니다.");
		else
			System.out.println("p1과 p2는 다른 사람입니다.");
	}
}

hashCode():

-객체의 해시코드를 반환하는 메서드
-Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
-equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야 함.
이유: equal()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

Object의 hashCode() 구조

public class Object {
...
public native int hashCode();
}

System.identityHashCode(Object obj) // 객체마다 다른 해시코드 반환

native 메서드: OS의 메서드(c언어로 작성돼 있지만 자바에서 사용하게 해줌)

objects.hash() // ( ) 안 값의 해시코드를 조합하여 반환. 공통된 값을 가진 객체는 동일한 해시코드를 가짐.

toString():

객체를 문자열(String)으로 변환하기 위한 메서드

Object의 toString() 구조

public String toString() {
	return getClass.getName()+"@"+Integer.toHexString(hashCode());
}

String클래스:

-데이터(char[]) + 메서드(문자열 관련)
-내용을 변경할 수 없는 불변클래스
-덧셈 연산자(+)를 이용한 문자열 결합은 성능 떨어짐.
String a = "a";
String b = "b";
a = a+b;

문자열의 결합이나 변경이 잦다면, 내용을 변경 가능한 StringBuffer를 사용

문자열의 비교

String str = "abc";  // 문자열 리터럴
String str1 = new String("abc"); // 새로운 String 객체 생성

문자열 리터럴:
-문자열 리터럴은 프로그램 실행 시 자동으로 생성.(constant pool에 저장)
-같은 내용의 문자열 리터럴은 하나만 만들어짐.

빈 문자열("", empty string):
-내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열

크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

느낀 점

중간에 코드 엄청 긴 거 넣을 때 넣을까 말까를 엄청 고민했는데 나중에 봤을 때 내가 이해 못 할 것 같아서 길어도 그냥 넣어줬다. 졸리다..

profile
걱정하지 말고 일단 해봐!

0개의 댓글