
java - throw new
2020. 4. 29. 12:45
📌 java/java
} catch(Exception e){ System.out.println("오류가 발생했습니다 : "+e.getMessage()); } e는 변수다. 이 변수 앞의 Exception은 변수의 데이터 타입이 Exception이라는 의미다. Exception은 자바에서 기본적으로 제공하는 클래스로 java.lang에 소속되어 있다. 예외가 발생하면 자바는 마치 메소드를 호출하듯이 catch를 호출하면서 그 인자로 Exception 클래스의 인스턴스를 전달하는 것이다. e.getMessage()는 자바가 전달한 인스턴스의 메소드 중 getMessage를 호출하는 코드인데, getMessage는 오류의 원인을 사람이 이해하기 쉬운 형태로 리턴하도록 약속되어 있다. 지금까지 API의 소비자로서 API 측에서 던지..

java - throw & throws
2020. 4. 28. 17:40
📌 java/java
지금까지 예외를 처리하는 방법으로 try...catch...finally를 배웠다. 이외에 다른 방법도 있다. throw를 사용하는 것이다. throw는 예외처리를 다음 사용자에게 넘기는 것이다. 다음 사용자는 누구일까? 코드를 보자. package org.opentutorials.javatutorials.exception; class B{ void run(){ } } class C{ void run(){ B b = new B(); b.run(); } } public class ThrowExceptionDemo { public static void main(String[] args) { C c = new C(); c.run(); } } ThrowExceptionDemo.main 클래스 ThrowExcep..

java - 예외의 강제
2020. 4. 28. 17:25
📌 java/java
API를 사용할 때 설계자의 의도에 따라서 예외를 반드시 처리해야 하는 경우가 있다. 아래의 예제를 보자. package org.opentutorials.javatutorials.exception; import java.io.*; public class CheckedExceptionDemo { public static void main(String[] args) { BufferedReader bReader = new BufferedReader(new FileReader("out.txt")); String input = bReader.readLine(); System.out.println(input); } } 어려운 코드다. 하지만 지금의 맥락에서는 중요한 내용이 아니다. 그래서 예외와 관련되지 않은 부분..

java - finally
2020. 4. 28. 16:29
📌 java/java
finally는 try 구문에서 예외가 발생하는 것과 상관없이 언제나 실행되는 로직이다. 예제를 조금 변경해보자. package org.opentutorials.javatutorials.exception; class A{ private int[] arr = new int[3]; A(){ arr[0]=0; arr[1]=10; arr[2]=20; } public void z(int first, int second){ try { System.out.println(arr[first] / arr[second]); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("ArrayIndexOutOfBoundsException"); } catch(Arithmet..

java - 좀 더 다양한 exception들
2020. 4. 28. 16:09
📌 java/java
이번에는 좀 더 다양한 예외 상황을 처리하는 방법을 알아보자. 코드를 보자. package org.opentutorials.javatutorials.exception; class A{ private int[] arr = new int[3]; A(){ arr[0]=0; arr[1]=10; arr[2]=20; } public void z(int first, int second){ System.out.println(arr[first] / arr[second]); } } public class ExceptionDemo1 { public static void main(String[] args) { A a = new A(); a.z(10, 1); } } 위의 결과는 아래와 같다. 이유를 따져보자. 배열 arr은 3..

java - exception 발생에 대한 처리
2020. 4. 28. 16:01
📌 java/java
예외의 핵심은 뒷수습이다. 하지만 제대로 된 수습은 대단히 어려운 문제이다. 여기서는 자바에서 기본적으로 제공하는 뒷수습의 방법만 알아본다. 코드를 조금 바꿔보자. package org.opentutorials.javatutorials.exception; class Calculator{ int left, right; public void setOprands(int left, int right){ this.left = left; this.right = right; } public void divide(){ try { System.out.print("계산결과는 "); System.out.print(this.left/this.right); System.out.print(" 입니다."); } catch(Exce..

java - try, catch
2020. 4. 10. 21:57
📌 java/java
객체 지향 이전까지가 프로그램을 동작하게 하는 법이라면 객체 지향은 웅장한 소프트웨어를 만들기 위한 방법이라고 할 수 있다. 그리고 필자는 이러한 지식을 성공하기 위한 지식이라고 부르고 싶다. 지금부터 배울 것은 예외라는 것이다. 예외는 실패하지 않는 법에 대한 수업이다. 아무리 좋은 기획, 좋은 구조 그리고 높은 성능을 가진 소프트웨어라도 심각한 오류나 보안 약점으로 인해서 모든 것을 잃어버릴 수 있다. 안타까운 것은 이러한 문제들이 소를 잃고 나서야 부각된다는 점이다. 어찌 보면 이것은 자연스러운 인간의 마음일 것이다. 또 그렇기 때문에 탁월한 성취라는 것이 흔치 않은 것이기도 할 것이다. 필자는 어렸을 때 합기도를 다녔다. 합기도에서 제일 처음 배우는 것은 무엇일까? 발차기일까? 호신술일까? 아니다..

java - 다형성
2020. 4. 4. 21:30
📌 java/java
이번 시간에는 다형성(Polymorphism)이라는 주제에 대해서 알아보자. 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 키보드의 키를 통해서 비유를 들어보겠다. 키보드의 키를 사용하는 방법은 '누른다'이다. 하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다. 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다. 다형성은 객체나 인터페이스 또는 추상과 같이 철학적인 느낌을 자아내는 용어이다. 그래서 이 주제 또한 철학적이고 현학적인 느낌으로 여러분을 혼란스럽게 할 수 있으나 그것은 학습에 도움이 되지 않는다. 다형성이라는 것이 코드 상에서는 구체적으로 어떤 모습으로 드러나는지에 집중하자..
java - 인터페이스
2020. 4. 4. 18:15
📌 java/java
인터페이스란? 인터페이스(interface)는 다소 추상적인 개념이다. 인터페이스가 무엇인가를 철학적으로 논하려면 책 한권이 필요할지도 모르겠다. 하지만 우리는 철학 공부를 하는 것이 아니라 공학 공부를 하는 것이니 자바의 기능으로서 인터페이스를 받아들이면 되겠다. 필자가 앞선 수업에서 인터페이스를 abstract, final와 함께 대표적인 규제라고 언급했던 것 기억하는가? 인터페이스의 역할은 이렇다. 어떤 객체(class)가 있고 그 객체(class)가 특정한 인터페이스를 사용한다면 그 객체(class)는 반드시 인터페이스의 메소드들을 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 에플리케이션은 컴파일 조차 되지 않는다. 예제 우선 단순한 예를 보자. package o..

java - final
2020. 4. 4. 17:04
📌 java/java
추상이 상속을 강제하는 것이라면 final은 상속/변경을 금지하는 규제다. 이 정도로 final의 용도를 기억해두고 코드를 보자. final 필드 필드와 변수는 같은 의미라는 것 기억할 것이다. 실행되는 과정에서 한번 값이 정해진 이후에는 변수 내의 값이 바뀌지 않도록하는 규제다. 클래스 맴버와 인스턴스 맴버 토픽의 첫번째 예제를 기반으로 내용을 조금 바꾸었다. 3.14의 값을 사용자가 절대로 바꿀 수 없게 만드는 것 package org.opentutorials.javatutorials.finals; class Calculator { static final double PI = 3.14; int left, right; public void setOprands(int left, int right) { t..

java - abstract
2020. 4. 4. 15:29
📌 java/java
abstract란 한국어로는 추상으로 번역된다. 이에 대한 정의는 뒤에서 내리도록 하고 지금 단계에서는 abstract라는 것이 상속을 강제하는 일종의 규제라고 생각하자. 즉 abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이 abstract다. 상속해서 사용하도록 강제 ! 사용자가 직접 예쁘게 디자인 해야하는 부분은 abstract로 선언한다. + 상속 강제 추상 메소드 추상 메소드란 메소드의 시그니처만이 정의된 비어있는 메소드를 의미한다. 아래의 코드를 보자. package org.opentutorials.javatutorials.abstractclass.example1; abstract class A{ public abstract int b(); //본체가 ..

java - API
2020. 3. 17. 17:52
📌 java/java
기본 패키지와 사용자 정의 로직 아래 코드를 보자. System.out.println(1); 지금까지 무수히 많은 예제에서 사용했던 코드다. 이것이 화면에 어떤 내용을 출력하는 것이라는 건 이미 알고 있다. 하지만 도대체 우리가 정의한 적이 없는 이 명령은 무엇일까?를 생각해볼 때가 왔다. 문법적으로 봤을 때 println은 메소드가 틀림없다. 그런데 메소드 앞에 Sytem.out이 있다. System은 클래스이고 out은 그 클래스의 필드(변수)이다. 이 필드가 메소드를 가지고 있는 것은 이 필드 역시 객체라는 것을 알 수 있다. 그리고 System을 인스턴스화 한 적, import한 적이 없음에도 불구하고 필드 out에 접근할 수 있는 것은 out이 static이라는 것을 암시한다. 그럼 System..
java - class, public class 차이
2020. 3. 10. 22:31
📌 java/java
Program.java 라는 이름을 가진 클래스 파일로 예시를 들어보자. Program.java class Program { } 문제없이 컴파일이 잘 된다. 위 소스 파일에 아래와 같은 클래스를 하나 더 추가해보자. class Program { { class Program2 { } 역시나 문제없이 컴파일이 잘 된다. 그렇다면 아래와 같이 수정을 해보자. class Program { } public class Program2 { } Program2라는 클래스 앞에 public이라는 접근제어자를 붙였더니 이번에는 컴파일 에러가 발생한다. 그럼 아래와 같이 수정을 해보자. public class Program { } class Program2 { } 문제없이 컴파일이 잘 된다. 어떤 차이일까? 위와 같이 컴파..

java - 패키지
2020. 3. 10. 22:21
📌 java/java
패키지는 여러 사람이 만들기 때문에 이름이 중복될 수 있다. 이름의 중복을 피하기위한 방법을 찾아보자. 나한테 원래 java.txt가 있는데 누군가 나에게 java.txt라는 파일을 줬을 때 이름이 겹치는데 그때 필요한게 디렉토리이다. a 디렉토리의 java.txt가 존재해도 b 디렉토리의 java.txt가 존재할 수 있다. 전역변수와 지역변수도 이 이름의 충돌을 해소하기 위한 하나의 수단으로 볼 수 있다. 패키지 만들기 우리는 이미 패키지를 사용해왔다. 일부 IDE들은 패키지의 사용을 강제하고 있기 때문에 독자가 패키지가 무엇인지도 숙지하지 않은 상태에서 패키지를 사용한 것이다. 주제에서 어긋나는 이야기이지만 지식이라는 것이 사실은 순차적이지 않고 네트워크적이라는 점을 생각해볼 필요가 있다. 순차적인 ..

java - 클래스 패스, 환경 변수 [참고용]
2020. 3. 10. 21:30
📌 java/java
클래스 패스 클래스가 위치하는 경로를 우리가 지정해서 자바가 필요로 하는 어떤 클래스를 로드하는 방법을 지정하는 것이 클래스 패스이다. 빈 디렉터리에 아래와 같이 코드를 작성한다. 필자는 프로젝트 디렉토리에 /srcbin 이라는 디렉토리를 만들고 여기에서 실습을 진행할 것이다. 아래 예제의 파일명은 ClasspathDemo.java 이다. class Item{ } class ClasspathDemo { } 컴파일을 한다. javac ClasspathDemo.java 그 결과 두 개의 클래스 파일이 생성된다. ClasspathDemo.class Item.class 즉 클래스 하나는 하나의 클래스 파일이 된다는 것을 알 수 있다. 클래스의 경로 ClasspathDemo2.java을 만들고 내용을 아래와 같이..

java - overloading
2020. 3. 10. 11:33
📌 java/java
overloading 계산기 예제로 돌아가보자. 우리의 계산기는 2개의 값(left, right)에 대한 연산(sum, avg) 만을 수행 할 수 있다. 그런데 만약 3개의 값을 대상으로 연산을 해야 한다면 어떻게 해야할까? 우선 아래와 같이 입력값을 3개 받아야 할 것이다. c1.setOprands(10, 20, 30); 이를 위해서 기존의 setOprands 메소드를 아래와 같은 모습을 수정한다면 2개의 입력값을 받을 수 없게 될 것이다. public void setOprands(int left, int right, int third){ this.left = left; this.right = right; this.third = third; } 이런 경우 아래와 같이 메소드의 이름을 변경하면 될 것이다..