자바 강의, 코테 문제
문제 설명
배열 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;
}
}
오늘은 별로 안 걸렸다. 크게 모르는 부분이 없어서
throws: 메서드에서 특정 예외가 발생할 가능성이 있음을 선언할 때 사용
반환타입 메서드명(매개변수) throws 예외클래스 {
// 예외 발생 가능성이 있는 코드
}
예외 처리를 어디에서 하면 좋을 지를 생각하며 코드를 짜는 것이 좋음.
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() // 원인 예외를 반환
-모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있음.
-notify(), wait() 등은 쓰레드와 관련된 메서드
-객체 자신(this)와 주어진 객체(obj)를 비교. 같으면 true, 다르면 false
-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는 다른 사람입니다.");
}
}
-객체의 해시코드를 반환하는 메서드
-Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
-equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야 함.
이유: equal()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
public class Object {
...
public native int hashCode();
}
System.identityHashCode(Object obj) // 객체마다 다른 해시코드 반환
native 메서드: OS의 메서드(c언어로 작성돼 있지만 자바에서 사용하게 해줌)
objects.hash() // ( ) 안 값의 해시코드를 조합하여 반환. 공통된 값을 가진 객체는 동일한 해시코드를 가짐.
객체를 문자열(String)으로 변환하기 위한 메서드
public String toString() {
return getClass.getName()+"@"+Integer.toHexString(hashCode());
}
-데이터(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인 배열을 생성하는 것은 어느 타입이나 가능
중간에 코드 엄청 긴 거 넣을 때 넣을까 말까를 엄청 고민했는데 나중에 봤을 때 내가 이해 못 할 것 같아서 길어도 그냥 넣어줬다. 졸리다..