java
Java 예외 처리
try-catch-finally 블록 try{ } catch(예외클래스 e) { // 예외 처리 } finally { //정상 실행 } (finally 블록은 항상 실행되는 부분이다) 다중 catch 발생하는 예외별로 예외 처리 코드를 다르게 하는 다중 catch 블록을 가질 수 있다. try{ } catch(예외클래스1 e) { // 예외 처리1 } catch(예외클래스1 e) { // 예외 처리2 } 하지만 첫번째 catch에 예외클래스로 Exception을 사용하면 모든 예외가 Exception에 상속되어 있기 때문에 첫번째 줄에 다 catch 되어서 컴파일 오류가 발생하게 된다. throws 키워드 사용 throws 키워드는 메소드에서 처리하지 않은 예외를 호출한 곳으로 넘김으로써 호출한 곳에서 ..
Java 예외 클래스
에러와 예외 보통 자바에서 하드웨어로 인한 프로그램의 실행 오류를 에러로 구분하고 프로그램 자체 내에서 발생하는 오류(잘못된 조작, 잘못된 코딩 등 소프트웨어적인 오류)를 예외라고 한다. 자바에서 예외는 크게 일반 예외와 실행 예외로 구분되어진다. 일반 예외(컴파일러 체크 예외) 컴파일러가 예외 처리 코드가 있는지 없는지 체크하여 없으면 개발자가 예외 처리 코드를 작성하도록 한다. # java.lang.Exception을 상속받은 클래스들을 일반 예외라고 부른다. 실행 예외 반대로 실행 예외의 경우엔 컴파일러가 따로 체크를 하지 않는데 그 이유는 언제 실행 예외가 발생할지 알 수 없기 때문이다. # java.lang.RuntimeException을 상속받은 클래스들을 실행 예외라고 부른다. 실행 예외의 ..
Java 익명 객체
익명 객체 클래스 이름이 없는 객체를 익명 객체라고 부르고 어떤 클래스를 상속하거나 인터페이스를 구현해야한다. //이름이 있는 객체의 상속 public class Class_Name extends Main_C {} Main_C var = new Class_Name(); //익명 객체의 상속 Main_C var = new Main_C() {}; //괄호 안에는 익명 객체의 내용이 들어감 //이름이 있는 객체의 구현 public class Class_N implements I {} I var = new Class_N(); //익명 객체의 구현 I var = new I() {}; 익명 자식 객체의 사용 - 필드 선언할 때 초기값으로 익명 자식 객체를 생성하여 대입! public class Main { Pare..
Java 중첩 클래스와 중첩 인터페이스
중첩 클래스란? 클래스 내부에 선언된 클래스로서 바깥 클래스와 긴밀한 관계를 가지며 바깥 클래스가 없으면 필요없는 클래스이다. 중첩 클래스의 종류는 크게 멤버 클래스와 로컬 클래스로 나눌 수 있다. 멤버 클래스의 경우 클래스의 멤버로서 선언되고 멤버 클래스는 다시 인스턴스와 정적으로 나뉠 수 있다. class Main{ class Sub{} // 인스턴스 static class Sub2{} //정적 } 인스턴스 멤버 클래스의 경우 정적 필드와 메소드는 선언할 수 없고 인스턴스 필드와 메소드만 선언이 가능하다. public class Main{ class Sub{ Sub(){} int cnt; //static 사용 불가 void test(){} //마찬가지로 static 사용 불가 } } public cl..
Java 타입 변환과 다형성
인터페이스의 다형성 인터페이스는 동일한 인터페이스로 구현 객체를 교체해서 다양한 프로그램 실행 결과를 얻을 수 있다. 자동 타입 변환 구현 객체와 그 구현 객체의 자식 객체는 인터페이스 타입으로 알아서 자동 타입 변환이 된다. Interface_Name var = new Test(); // Test의 자식 객체도 구현 객체처럼 사용할 수 있음. 강제 타입 변환 보통 구현 객체가 인터페이스 타입으로 자동 변환 되면 인터페이스에 있는 메소드만 사용이 가능한데 구현 객체에서만 선언된 필드나 메소드를 사용할 필요가 있을 경우엔 강제 타입 변환이 필요하다. interface Vehicle{ void run(){} } class Bus implements Vehicle{ void run(){} void only()..
Java 인터페이스
인터페이스 객체의 사용 방법을 정의한 타입으로서 다양한 객체를 동일한 사용 방법으로 이용할 수 있다. 즉, 인터페이스를 이용하면 개발 코드를 바꾸지 않고서 다양한 객체를 사용할 수 있다. 인터페이스 사용은 interface 인터페이스이름{ //상수 타입 상수이름 = 값; // 추상 메소드 타입 메소드이름(매개변수); } 상수 필드 선언 상수 필드에는 데이터를 저장할 인스턴스나 정적 필드가 올 수 없다. 따라서 처음 값을 지정해줘야한다. [public static final] 타입 상수이름 = 값; //앞에 부분은 상수필드이기 때문에 생략이 가능 추상 메소드 선언 추상 메소드도 마찬가지로 앞에 public abstract를 앞에 생략 가능하며 인터페이스의 메소드 호출은 객체에서 메소드에서 실행된다. 구현 ..
Java 추상클래스
추상클래스 여러 클래스의 공통된 특성(필드나 메소드)를 추출해서 선언한 것을 추상 클래스라고 한다 보통 추상클래스와 실체 클래스는 부모 자식 관계를 가진다. 즉, 실체 클래스(자식)는 추상 클래스(부모)와 상속 관계를 갖게 된다. 추상 클래스 선언 추상 클래스 선언할 때는 abstract 키워드를 이용한다. 그 이유는 상속을 통해 자식 클래스만 만들 수 있게 하기 위해서이다.(즉, 부모로서의 역할만 수행하도록 함) public abstract class 클래스명 { //필드 선언 부분 //생성자 선언 부분 //메소드 선언 부분 } 추상 클래스는 부모로서의 역할만 하기 때문에 new 키워드로 객체를 생성할 수 없으나(직접 객체 생성이 불가능) 그러나 자식 객체가 생성될 때 객체화 된다.(자식 생성자에서 s..
Java 타입 변환과 다형성
타입 변환 기본 타입과 마찬가지로 클래스에도 타입 변환이 존재! 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 자동 타입 변환이라고 하고 형식은 부모타입 변수 = 자식타입; 로 나타낼 수 있다. Sub test = new Sub(); Main test1 = test; 자동 타입 변환은 굳이 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입인 경우에도 일어날 수 있다. 그리고, 부모 타입으로 자동 변환된 이후에는 부모 클래스에 선언된 필드 및 메소드만 접근이 가능! 하지만 자식 클래스에서 메소드가 재정의 되었을 경우엔 자식 클래스의 메소드가 대신 호출된다 public class Main { public void test1() {} public void test2() {System.out.pri..
Java 상속
상속이란 부모 클래스의 멤버를 자식 클래스에게 물려주는 것을 말한다. 그러면 상속을 쓰는 이유는 무엇일까? 이미 개발된 클래스를 재사용하여 코드의 중복을 줄이거나 부모 클래스의 한번의 수정으로 모든 자식 클래스가 수정되는 효과가 있어 유지보수 시간이 줄어들게 되기 때문에 사용! class 자식클래스 extends 부모클래스 { //필드 //생성자 //메소드 } class TestSub extends TestMain {} 위처럼 자식 클래스는 여러 개의 부모 클래스를 상속할 수 없으며 부모 클래스에서 private 접근 제한 갖는 필드와 메소드는 상속 대상에서 제외되며 부모와 자식 클래스가 서로 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드도 제외! 부모 생성자의 호출 자식 객체를 생..
Java 접근 제한자
접근 제한자 - 클래스와 인터페이스 및 이들이 가진 멤버의 접근 제한 - public : 외부 클래스가 자유롭게 사용 가능 - protected : 같은 패키지 또는 자식 클래스에서 사용 가능 - private : 외부에서 사용 불가능 - default : 같은 패키지에 소속된 클래스에서만 사용 가능 외부에서 객체에 마음대로 접근할 경우 객체의 무결성이 깨질 수 있기 때문에 Getter method와 Setter method가 필요! public class Test { private double val; private double cm; } Setter method - 주로 외부의 값을 받아 필드의 값을 변경하는 것이 목적 void setTest(double val){ if (val < 0){ this...