이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

프로그램 오류

1. Compile time Error: 컴파일 발생 시 에러

(cf. Compiler 역할: 구문 체크, 번역, 최적화)

 

2. Runtime Error: 실행 시 발생 에러

Runtime Error의 종류

2.1. Error: 수습할 수 없는 심각한 오류

2.2. Exception: 수습할 수 있는 다소 미약한 오류

Exception의 종류

2.2.1. exception과 그 자손: checked 예외-컴파일러가 에러 확인, try catch 필수

2.2.2. runtimeexception과 그 자손: unchecked 예외-try catch 선택

예: arithmetic, classcast, nullpoint, indexoutofbound 등

 

3. Logical Error: 작성 의도와 다르게 동작

 

 

Exception class: 프로그램 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

RuntimeException class: 프로그래머의 실수로 발생하는 예외

- Arithmetic Exception: 산술 계산 예외(5/0)

- ClassCast Exception: 형변환 오류

- NullPointException: String = null; String.length

- IndexOutOfBounds Exception: 배열 범위 벗어남

 

예외 처리: try-catch

 

try{} // 예외 발생 시, 그 이후 문장 수행X

catch(exception e1){}

catch(exception e2){} // catch 발생 후 문장 수행X

catch(exception e3){}

*if문과 달리 {} 생략 불가

 

만일 일치하는 catch 블럭이 없으면 예외가 처리되지 못함

이후 실행되어야하는 문장도 실행X

 

Exception은 모든 예외의 조상이라 모든 예외 처리 가능

그러므로 마지막 catch 블럭으로 활용

 

예외 발생시키기

Exception e = new Exception(”예외 메세지”)

throw e;

 

예외 발생 시 예외 객체 생성

: printStackTrace method 및 getMessage method 등이 있음

- printStackTrace: 예외 당시의 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력

- getMessage: 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있음

- ArithmeticException ae: ae는 참조 변수

{} catch 블럭 내에서 사용 가능

 

멀티 catch 블럭

catch(ExceptionA e) {e.printStackTrace();}

catch(ExceptionB e2) {e.printStackTrace();}

catch(ExceptionA | ExceptionB e) {e.printSrackTrace();}

 

단, ()안에 부모자식관계X

(조상 class exception으로 자식 exception을 잡을 수 있으므로)

 

(ExceptionA){} 에 선언된 method A() 호출 불가

→ Exception A와 B의 공통 멤버만 사용 가능

(A인지 B인지 어디 객체가 소환되었는지 알 수 없으므로)

 

정쓰고 싶으면 형변환

if(e instanceof ExceptionA) {

ExceptionA e1 = (ExceptionA) e;

e1.methodA();

} else

 

checked exception: 컴파일러가 예외 처리여부를 확인(예외 처리 필수)

→ Exception과 그 자손

 

unchecked exception: 컴파일러가 예외 처리 여부를 체크하지 않으므로 예외처리 선택

→ runtime exception과 그 자손

→ 프로그래머가 주의해야하는 부분

 

throw 예외 발생

throws 예외 알리기

void method() throws Exception1, Exception2, … {}

void method() throws Exception {} - 필수처리 예외만 선언(안되는 건 아니지만..)

 

Cf. 오버라이딩 조건

선언부 일치

접근제어자 좁게 X

조상보다 많은 예외X (단순 갯수가 아닌 범위*)

 

 

finally {}

예외 발생 여부에 관계없이 항상 수행되어야하는 문장들을 넣는다.

finally 블럭은 try-catch 문의 맨 마지막에 위치

 

 

사용자 정의 예외

: Exception or RuntimeException 중 상속받기

 

 

 

예외 되던지기:

예외를 처리한 후에 다시 예외를 발생시키는 것

호출한 메서드와 호출된 메서드 양쪽 모두가 예외처리를 하는 것

 

 

연결된 예외 사용이유:

여러 예외를 하나로 묶어주기 위해

checked exception을 unchecked exception으로 변경하려할 때

→런타임 예외를 만들어서 예외를 넣어줌

* 필수처리가 필요없는 exception이 있어서 Runtime Exception으로 바꿔서 try catch 구문 낭비를 방지

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 [자바의 정석] ch8-1~3 프로그램오류. 예외 클래스의 계층구조

📑 자바의 정석 8장 - finally 블럭

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

인터페이스(interface)

구현된 것이 전혀 없는 설계도, 모든 멤버가 public

abstract method의 집합 - iv 불가

cf. abstract class: abstract method를 갖고 있는 일반 class - iv를 갖을 수도 있음

interface 내부에서는 public abstract 생략 가능

인터페이스의 조상은 인터페이스만 가능

클래스와 달리 다중 상속이 가능

 

interface의 구현

class className implements interfaceName {}

: 인터페이스에 정의된 추상 메서드를 완성하는 것

 

인터페이스에서 일부만 구현 시, abstract class 선언

인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능

 

인터페이스 장점

: 선언과 구현을 분리할 수 있음

: class A → interface I → class B의 관계를 만들어주면 class C로 변경해야하는 경우도 변경할 필요X

: 서로 관계없는 클래스들의 관계를 맺어줄 수 있다.

→ 상속관계와 관계 없이 인터페이스로 묶어줄 수 있음

 

종합

 

내부 클래스(Inner Class): 외부 클래스의 멤버들에 쉽게 접근 가능

 

 

class의 접근 제어자: public, (default)

inner class의 접근 제어자: public, prodected, (default), private

 

Instance class: iv만 선언 가능(final static은 상수이므로 허용)

Static class: cv, iv 모두 선언 가능

Instance Method: instance member, static member에 접근 가능

Static Method: static member만 접근 가능

 

Instance member는 Static member에 접근 가능

Static member는 Instance member에 접근 불가

Static Method에서 Instance member에 접근 시, outer class를 먼저 생성

 

 

outer class의 private member도 접근 가능

LocalInnerClass: outer class의 local variable은 final이 붙은 상수만 접근 가능

final이 생략가능하게 되면서 final이 붙지 않은 변하지 않는 변수에도 접근 가능

(단, 변수 lv 값 변화 시 변수화되어 오류 발생)

Compile 시, class 생성

1. Ex7_15

2. Outer2

3. Outer2$InstanceInner

4. Outer2$StaticInner

5. Outer21LocalInner - LocalInner의 경우, 숫자가 추가적으로 붙음(Method가 여러 개 있을 수 있으므로)

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 자바의 정석 7장 - 내부 클래스의 제어자, 접근성

 

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

객체 배열 및 instanceof 활용

 

 

추상 클래스(abstract class): abstract method를 갖고 있는 클래스

* 다른 class 작성에 도움을 주기 위한 것으로 instance 생성 불가

-> 상속을 통해서 자손이 구현부를 완성한다면 객체 생성 후 호출 가능

 

추상 매서드(abstract method): 선언부만 있고 구현부가 없는 method

: abstract methodName();

* 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상될 경우에 사용

: abstract 없이 {}을 쓸 수 있지만 abstract를 쓴다면 해당 method 구현부 작성을 강제할 수 있음

(추상 클래스를 상속할 때, 모든 추상 매서드를 구현해줘야 오류가 나지 않음)

→ 일부만 구현해도 되지만, abstract를 class에 붙여서 추상화가 남음을 알려줌

 

 

abstract class는 instacne 생성은 불가하지만, 배열은 생성 가능(다형성으로 구현된 class의 instance 활용)

 

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 자바의 정석 7장 - 추상 클래스

📑 [자바의 정석] ch7-31,32 추상 클래스, 추상 메서드 

📑 자바 instanceof 연산자 47강

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

 

다형성(polymorphism): 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

* 참조변수 타입(t)은 인스턴스 타입(SmartTv)과 반드시 일치해야 하는 것은 아님

 

Tv t = new Tv();

SmartTv s = new SmartTv();

->

Tv(조상) t = new SmartTv(자손)();

스마트 tv 7개의 기능을 tv리모콘으로 5개만 쓸 수 있음

 

* 자손타입의 참조변수로 조상타입의 객체를 가리킬 수 없다.

SmartTv s = new Tv(); // Error

 

 

 

기본형의 형변환: 값이 변환

double 3.6 → int 3

 

참조형의 형변환: 사용할 수 있는 멤버의 갯수 조절

조상, 자손 관계의 참조변수는 서로 형변환 가능

(자손->조상: 자동 형변환 가능=형변환 생략 가능, 조상->자손: 형변환 생략 불가)

형제 관계의 참조변수는 서로 형변환 불가

 

instanceof

참조변수의 형변환 가능여부 확인 사용, 가능하면 true 반환

* 반드시 형변환 전 instanceof로 확인

 

 

매개변수의 다형성

: 메서드의 매개변수로 조상 클래스의 참조변수를 통해 하나의 메서드로 여러 타입의 객체를 받을 수 있는 것

buy(Product p) -> buy(Tv t), buy(Audio a) 등 모두 가능

 

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 [자바-객체지향2] 캡슐화

📑 [자바의 정석] ch7-22 캡슐화

 

이 글은 남궁성의 정석코딩 [자바의정석-기초편] 수강하며 정리한 글입니다.

 

 

🟣 기본 환경: IDE: Eclipse, Language: Java

 

 

패키지(package): 서로 관련된 클래스의 묶음

class: 물리적 파일(.class), pkg: 물리적 디렉토리

클래스의 실제이름은 패키지를 포함(java.lang.String)

 

패키지 선언

패키지는 소스 파일의 첫 번째 문장으로 단 한 번만 선언

같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 됨

패키지 선언이 없으면 이름없는 패키지(default)에 속하게 됨

class와의 구별을 위해 첫글자는 소문자로 작성

 

cmd에서 java 실행

1. 해당 패키지의 주소*로 위치를 변경 cd: pkg 위치 지정

* pkg, class file 주소: 이클립스 alt + Enter

-> 해당 과정을 생략하기 위해 환경변수(ClassPath*) 설정

2. 올바른 위치인지 확인: dir 입력->해당 폴더 내 파일 확인

3. java pkgName.ClassName을 작성하여 실행

4. exit 입력하여 종료

 

* Class Path: 클래스 파일의 위치를 알려주는 경로로 경로간 구분자는 ;을 사용

classpath(환경변수)에 패키지 루트를 등록할 경우, cmd에서 경로를 따로 지정하지 않을 수 있음

- cmd상 classpath 지정여부 확인 ‘set classpath’

- cmd상 classpath 지정: set classpath=경로 ;를 구분자로 추가 가능

 

 

import문 삽입: 컴파일러에게 클래스가 속한 패키지를 알려줌 -> 패키지 이름을 생략할 수 있음

위치: pkg 선언과 class 선언 사이

import pkgName.CalssName;

(import pkgName.*; - 모든 클래스)

* 단축키: ctrl + shift + O

java.lang pkg 소속 class는 import문 사용없이 pkg.class가 아닌 class 사용 가능

이름이 같은 클래스가 속한 두 패키지를 import 할 때는 클래스 앞에 패키지 명을 붙여줘야 함

 

static import: 클래스 이름을 생략할 수 있게 해줌

-> 가독성이 좋지만, 의미가 불명확할 수 있음

 

import static java.lang.Integer.*;

// Interger class의 모든 static member(static variable, static method)를 Integer. 없이 사용 가능

import static java.lang.Math.random;

// Math.random() -> random()으로 사용 가능

import static java.lang.System.out;

// System.out.println() -> out.println() 으로 사용 가능

 

System.out.println(Math.random());

→ out.println(random());

 

 

static: member variable, method, 초기화 블럭에 사용 가능

 

 

final: 마지막의, 변경될 수 없음

- final class: 다른 클래스의 조상이 될 수 없음(String, Math)

- final variable: 변수 → 상수

- fianl method: Overriding 불가(조상 매서드 변경 불가)

 

abstract: 추상의, 미완성의

- abstract class AbstractTest{ //… } - 추상 클래스(추상 매서드를 포함한 클래스)

- abstract void move(); - 추상 매서드(구현부{}가 없는 메서드)

* AbstractTest a = new Abstract();

추상클래스의 인스턴스 생성 불가(=미완성 설계도로는 제품 생성 불가)

→ 상속을 통해서 구현부를 만들어 주고 객체 생성 가능

 

 

제어자(Modifier): 클래스와 클래스의 멤버(멤버변수, 메서드)에 부가적인 의미 부여

 

접근 제어자: public>protected>default(아무것도 안붙이는 경우)>private

그 외: static, final, abstract

하나의 대상에 여러 제어자를 같이 사용하는 것은 가능하나, 접근 제어자는 1개만 사용

예: public static final int WIDTH = 200;

 

 

접근 제어자(access modifier): 1개만 사용 가능하며, 제일 왼쪽에 작성

-> 외부로부터 데이터를 보호하기 위해서(캡슐화) 또는 내부적으로만 사용되는 부분을 감추기 위해 사용

 

public: 제한X

protected: 같은 패키지 내에서, 다른 패키지의 자손클래스에서도 접근 가능

(default): 같은 패키지(폴더) 내에서만 접근 가능

private: 같은 클래스(파일) 내에서만 접근 가능

-> 해당 class 외부에서 접근 시, getPrivateMemberName()

해당 class 외부에서 설정 시, setPrivateMemberName() 활용

* class 앞에는 public or (default)만 가능

 

 

 

소스 코드

🔗 HJ0216/java-practice

 

참고 자료

📑 [자바-객체지향2] 캡슐화

📑 [자바의 정석] ch7-22 캡슐화