페이지

2017년 10월 21일 토요일

[TIL][JAVA] 10/21 예외 처리 2

어제 하루 TIL을 하지 못한것에 대해 반성하며 , 오늘 일정이 바빴음에도 불구하고

조금만이라도 공부를 하여 TIL을 작성...


오늘 공부한 내용은 어제에 이어 예외 처리에 대한 부분을 공부하였다.


1. try – catch – finally return 


보통의 함수들은 return 을 만남과 동시에 값을 반환하며 함수가 종료된다. 
또한 어제 배운 내용에 의하면 try - catch - finally 가 있을 경우 , 항상 finally 가 마지막에 의무적으로 실행된다.

그렇다면 try - catch block에서 return이 실행되고 , finally에서도 return 이 있다면 결과는?


=> 결론은 실행 결과를 보면 Exception 발생으로 catch문이 실행되어 true return 되어야 하지만 , finally 문에 return false이기 때문에 최종 return 값이 False가 나오게 되었다.



2. throw vs throws

 => throw는 예외를 발생시키기 위해 사용되는 키워드 , throws는 예외를 떠넘기기 위해 사용되는 키워드, 주로 메소드나 생성자 선언의 끝 부분에 붙어서 사용됨.

2017년 10월 19일 목요일

[TIL][Java] 10/19 자바 기본 공부 - 상속 , final , 다형성 , 인터페이스 , default vs static , Exception

첫 번째 TIL이다.

오늘은 자바 기본 공부를 하였다.

정리 시작!

1. 상속


  • Def : 부모가 자식에게 메소드 , 멤버 변수 등을 물려주어 자식 클래스에서 구현하지 않아도 사용 할 수 있게 하는 것.
  • Purpose : 코드의 중복을 피하고 객체의 관계성을 지킬 수 있다.

  • 유의사항: 
  1. 상속을 하게 되도 private 접근 권한을 가진 필드와 메소드는 상속 대상에서 제외 됨
  2. 부모와 자식이 다른 패키지에 존재한다면 default 권한에 대해서도 상속 제외 됨.

2. final 키워드

  • final의 사용 예시
  1.  final class => 상속이 불가능한 클래스
  2.  final + 변수 => 초기값 설정 후 변경이 불가능 한 변수
  3.  final 메소드 => 오버라이딩 할수 없는 메소드

3. 다형성

* 개인적으로 자바를 처음 입문하는 입장에서 가장 낯설은 개념이라고 생각한다. 하지만 중요하니 꼭 다지고 넘어가자
* 다형성을 이해하기 위해선 상속과 인터페이스(적어도 상속 + 클래스)의 개념은 확실히 다질 것!


  • Def : 같은 타입이지만 다양한 인스턴스 객체에 따라 실행 결과가 달라 질 수 있는 성질.
  • Example
   빨간색 부분이 다형성이 적용된 예이다. 부모 클래스 A의 참조 변수(obj1,obj2)로 A를 상속받은 자식 클래스 B , B2의 인스턴스 (new B(), newB2())를 참조 할 수 있다.



4. 인터페이스

  • Def : 
  1. 자바에서 인터페이스는 객체의 사용방법을 정의한 타입이 말은 객체를 사용하는데 필요한 필드 , 메소드 들을 정의’ 해 놓은 타입이다.
  2. 서로 다른것에 대해 통신하기 위해 노출 된 부분이라고 생각한다.
     Ex) User Interface : 사용자와 디바이스 혹은 웹페이지 간에 통신하기 위해 노출 된 부분
         API(Application Programmble Interface) : 소비자와 응용프로그램 내부에 통신하기           위해 노출 된 부분

  • Purpose : 
  1. 인터페이스를 구현하는 하위 클래스에 대해 필요한 메소드를 강요할 수 있다.(상속과 비슷)
  2. 인터페이스를 활용하여 인터페이스를 구현한 하위 클래스에 대하여 자유롭게 참조 할 수 있다상속과 비슷할 수 있지만 , 인터페이스는 cost가 매우매우 저렴하다어떠한 메소드 구현도 , 필요하지 않다단지 정의만 하면 된다. (다형성!!!)

  • 인터페이스의 구성요소
=> 물리적으로 인터페이스는 클래스와 동일하다.(=~.class파일이 생성된다그러나 클래스는 필드 , 메소드 , 생성자를 갖는거에 비해 , 인터페이스는 상수 , 메소드 만을 갖는다
=> 인터페이스의 필드는 static final을 붙이지 않아도 자동으로 상수(static final)으로 컴파일된다.
=> 인터페이스는 객체생성이 불가하기 때문에 생성자가 없다또한 인스턴스 변수도 없다..
=> 인터페이스는 3가지의 메소드를 가질 수 있다.
1. 추상 메소드
2. 디폴트 메소드 (java 8 추가)
3. 정적 메소드 (java 8 추가)


5. default vs static

=> 두 메소드 다 인터페이스에 속한 메소드임에도 불구하고 실행 블록을 갖고 있다그러나 두 메소드의 차이점이 있는데 ,
default 메소드는 구현 클래스에서 overriding이 가능하다그러나 static 메소드는 overriding이 불가능하다.
또한 , static 메소드는 구현 클래스에서 사용이 불가능하다.

결론으로 , default메소드는 사실 구현 클래스의 인스턴스 메소드라고 생각해야 한다만약 구현 클래스에서 overriding을 한 경우 , 해당 메소드가 실행되고 , 구현되지 않을 경우 인터페이스의 메소드가 실행된다.
그러나 static method overriding이 불가능하다또한 구현 클래스의 참조로 사용 될 수 없다.

또한 , 구현 클래스와 인터페이스 간에 같은 이름을 가진 Static 메소드를 가질 수 있다그 말인 즉슨 , static 메소드는 해당 클래스에만 속한다.


* default 메소드의 필요성

=> default 메소드는 사실 인터페이스의 목적에 약간은 위배 되는 것 처럼 보인다왜냐 하면, default 메소드는 객체를 생성해서만 사용할 수 있는 인스턴스 메소드이기 때문이다.
그렇다면 왜 default 메소드를 만들었는 이유는 다음과 같다.
차후에 interface의 수정이 필요해서 method를 추가하게 되면 , 해당 interface를 구현한 모든 구현 클래스 들은 추가된 메소드를 빠짐없이 구현해야만 하는 상황에 놓인다.
이러한 곤란한 상황을 피하기 위해 default로 선언을 하게 되면 , 추가된 메소드에 대하여 구현 클래스는 overriding하여 쓰거나 , 그대로 쓰거나 , 할 수 있다결론적으로 많은 코드를 수정할 필요가 없어진다는 얘기.

6. Exception

*에러(Error) 와 예외(Exception)
=> 에러란 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것. 이러한 에러는 막을 수 없다. 그러나 예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.

* 예외는 두가지로 나뉜다. 일반 예외(=컴파일러 예외)와 런타임 예외가 있다.
* 일반예외 => Exception 상속 , 런타임 예외 => RunTimeException 상속
*예외 처리는 다음과 같은 방법으로 처리한다.
Try{
           Code which is expected to happen error
}catch (Error name which is you want to handle){
           Code (I,e. error message)
}finally{
           Code block which has to be operated.
}

Q. try 구문에 여러 개의 error가 있을 때 모든 error를 핸들링 할 수 있을까?
A. 그렇지 않다. Try 부분에서 error가 하나라도 발생 되면 해당 try문은 해당하는 catch 블락으로 가 코드를 실행하고 빠져나가게 된다.

* 예외 떠넘기기 (throws)

=> throws는 메소드 내에서 발생 될 수 있는 error를 메소드 내에서 handling하지 않고 메소드를 호출한 곳에서 handling하게 떠넘길수 있다.
해당 메소드(main method)에서 발생하는 IOEception 예외는 main문을 call하는 곳에서 try – catch를 통해 handling 해야만 한다.
위와 같이 main문에서 throws를 하게 되면 JVM이 예외처리를 하게 되고, JVM은 예외의 내용을 conslole에 출력하는 것으로 예외 처리를 한다.

사용자 정의 예외와 예외 발생
Built in 된 예외 클래스 말고 사용자가 원하는 상황에 대한 예외를 처리하기 위해 사용자 정의 예외를 만들 수 있다.
예외를 만드는 법은 클래스를 만드는 방법과 동일하며 일반예외 or 런타임예외에 따라 상속 받는 것이 달라진다.
사용자 정의 예외 클래스에선 대부분 생성자 선언만을 포함한다. 생성자는 parameter가 없는 기본 생성자와 예외 발생 원인(예외 메시지)를 전달하기 위한 String 매개 변수를 갖는 생성자 이다

Ex)
1. Exception class 생성

2. Create Exception by condition with 'throws'

3. Try - catch Exception on running method


=======================================================

TIL을 처음으로 해봣는데 방법에 대해서 조금 더 보기 좋은 구조로 바꿔야 될 필요가 있을 것 같다...

천천히 고민해보자..

2017년 10월 18일 수요일

[TIL] Today I Learned 시작 !

취업 준비를 하던 도중 뚜렷한 목표가 없이 사는 게 너무 싫어서 작게나마 목표를 설정하고

달성해가는 기쁨을 누리기 위하여 TIL을 시작하기로 결정하였다.

작성규칙은 다음과 같다.

1. 새롭게 배운 것에 대해서 내용만 줄줄이 쓰지 말고 , 자신의 생각과 느낌 , 자신이 이해한 그 생각을 적을것.

2. 언제든지 내용이 기억이 안날 수 있으므로 , 참고했던 내용이나 좋은 내용들은 꼭 링크로 걸어 둘것

rules for TIL [v0.1]

2017/10/19 시작

2017년 3월 14일 화요일

[Java] Static

Static의 개념에 대해서 정리하고자 한다.

자바에선 전역변수의 개념이 없다. 왜냐하면 모든 변수와 메소드는 클래스 내에만 존재하고

접근하기 위해선 메모리에 클래스의 인스턴스가 적재되 있어야 하기 때문이다. 그러나

static을 적용함으로써 클래스의 인스턴스를 메모리에 올리지 않고도 특정한 변수 , 메소드,

초기화문을 메모리에 올려 사용할 수 있다.

정리하자면 , 자바에서 함수나 멤버변수를 부르기 위해선 클래스의 인스턴스를 생성하여

객체참조를 통해 접근해야만 하지만 , static을 사용하면 클래스의 인스턴스를 생성하지

않고도 사용이 가능하다.


-Static의 메모리 할당순서

자바에서 static으로 선언할 수 있는 것은 다음과 같이 3가지 경우가 있다.

  1. static initializer : 정적 초기화문
  2. static variable : 정적 변수
  3. static method : 정적 메소드
위와 같은 것들을 선언할 수 있는데 실제로 메모리에 올라가는 순서는 다음과 같다.

2.static variable -> 1.static initializer -> 3.static method





==============추가==================

글을 정리하고나서 구글을 검색하다가 우연히 Java에서 static을 지양하라는 의견을 보았다.

괜찮은 내용인거 같아서 추가로 첨부한다.

Link : 자바에서 static을 지양하는 이유 

2017년 1월 17일 화요일

[Algorithm] 내리막 길


이번 문제는 지도의 이동 할 수 있는 경우의 수를 구하는 문제다. 이동하기 에 대한 문제를

많이 풀어 보지 않아서 문제를 해결하는데 어려움이 있었다. 문제에서 주어진 조건은

다음과 같다.

1. 상하좌우로 이동 할 수 있다.
2. 자신보다 값이 낮은 칸으로만 이동할 수 있다.

위의 조건을 만족하는 해결법을 찾기위해 간단하게

C[N][M] = C[N-1][M] + C[N+1][M] + C[N][M-1] + C[N][M+1]로 해결을 하려 했는데

위 방법에 대하여 한 가지 더 조건이 필요하다. 바로 DFS를 활용한 해결 방법이다. 이동이

가능하면 끝까지 depth를 증가시켜 가며 최대한으로 이동 한 후 해당 위치에 대한

경우의 수를 계속해서 체크해 나가는 식으로 해결 하였다.



2017년 1월 4일 수요일

[Algorithm] 쇠막대기


이번 문제는 stack을 이용한 문제다. 괄호로 표현된 문자열에서 절단기와 막대기 두종류가

있는데 절단되는 막대기의 갯수를 구하는 문제다. 해결방법은 다음과 같다.

'(' 기호가 들어오면 스택에 해당 인덱스를 저장한다. ')'기호가 들어오면 스택에서 pop을

통해 인덱스를 얻어 온 후 바로 인접한 인덱스면 절단기라고 판단하고 여태 까지 저장된

막대기들을 절단한다. 절단 하면서 얻어지는 결과값을 더해준다.

예를 들어 , 두번째 절단기가 나타나기 전까지 stack에 들어있는 '('는 4개이다. ')'를 만나고

pop을 했을 때 인접한 인덱스이므로 절단기로 판단하고 나머지 3개에 대해 cutting을 하게

되면 3개의 조각이 추가된다. 만약 절단기가 나타나지 않고 ')'를 만나면 +1을 해준다.

Source:
import java.io.*;
import java.util.*;
public class a_10799 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(br.readLine());
int len = sb.length();
Stack<Integer> stk = new Stack();
char temp;
int p;
int ans=0;
for(int i=0;i<len;i++){
temp = sb.charAt(i);
if(temp=='(') stk.push(i);
else{
p=stk.pop();
if(i-p==1) ans+=stk.size();
else ans++;
}
}
System.out.println(ans);
}
}

2017년 1월 2일 월요일

[Algorithm] 팰린드롬?


이번 문제는 주어진 수열에서 입력으로 주어진 범위가 팰린드롬이 맞는지를 확인하는

문제이다. 이번 문제는 해결하는데 꽤나 오래 걸렸다. 처음엔 방법을 몰라 헤맸었지만

전처리를 한 후 쿼리 형식으로 해결을 하였다. 전처리를 하는데 필요한 시간은

O(n^2)이고 그 외 쿼리 처리에 대한 시간은 O(1)이다.

해결 방법은 다음과 같다. 2차원 배열 C에 C[start][end]의 팰린드롬 유무를 저장한다.

그렇게 하기 위해선 C[start+1][end-1]이 팰린드롬인지를 검사하고 입력된 값인

arr[start] == arr[end]의 조건도 성립해야만한다.

정리하자면 아래와 같다.

  1. 수열인 arr[start] == arr[end] 인지
  2. 그 다음 C[start][end] = C[start+1][end-1]인지를 검사한다.
위와 같은 방법으로 해결 하면 끝!

Source:

import java.io.*;
import java.util.*;

public class a_10942 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= N; i++)
arr[i] = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(br.readLine());
int[][] C = new int[N + 1][N + 1];
for (int i = 1; i <= N; i++) C[i][i] = 1; //길이가 1인 palindrome
for (int i = 1; i <= N; i++) {
for (int j = 1; j + i <= N; j++) { // i는 거리 , j는 start point
if (i == 1) {
if (arr[j + 1] == arr[j]) C[j][j + 1] = 1;
} else {
if ((arr[i + j] == arr[j]) && (C[j + 1][i + j - 1] == 1)) C[j][j + i] = 1;
}
}
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
bw.write(C[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())]+"\n");
}
bw.close();
}
}