본문 바로가기
Backend/Java

[자바의 신] 18장

by unknownomad 2022. 7. 26.

18장 - 이제 기본 문법은 거의 다 배웠으니 정리해 봅시다


객체지향 관련 용어 목록

  • 클래스(Class)
  • 상태(state)와 행위(behavior)
  • 캡슐화(Encapsulation)
  • 메시지(Message)
  • 객체(Object)
  • 상속(Inheritance)
  • Overriding
  • 다형성(Polymorphism)
  • Overloading

 

클래스(Class)

  • 상태와 행위를 갖는 자바의 기본 단위

 

상태(state)와 행위(behavior)

  • 상태 = 클래스나 인스턴스 변수
  • 행위 = 메서드

 

캡슐화(Encapsulation)

  • 연관된 상태와 행위를 결정하는 기능을 묶어주는 것
  • 기능을 묶어주면 클래스 밖에서 접근 가능한 대상을 제한하는 정보 은닉(information hiding) 가능
  • 하나의 객체 위한 코드가 다른 객체 위한 코드와 무관하게 수행할 수 있는 모듈화(modularity) 가능해짐
  • 묶여 있는 가장 작은 단위 = 클래스
public class Common {
    private int state; //private으로 선언함으로써 정보 은닉
    public void setState(int newState) { //상태 변경 가능
    }
}

 

메시지(Message)

  • 메서드에서 다른 메서드 호출 시 전달하는 값(매개 변수가 여기에 속함)

 

객체(Object)

  • 클래스 = 사물 단위
  • 객체 = 각 사물
Book godOfJava = new Book();
//Book: 클래스
//godOfJava: Book 중 하나를 의미하는 객체

 

상속(Inheritance)

  • 부모에 선언된 변수와 메서드에 대한 사용권 가짐
  • 클래스 선언 시
    • extends 사용해 확장
    • implements 사용해 구현

 

다형성(Polymorphism)

  • 부모 클래스에서 파생된 자식 클래스들의 기능은 각기 다를 수 있음
public class Parent {
    public void method() {
    }
}

public class FirstChild extends Parent {
    public void method() {
    }
}

public class SecondChild extends Parent {
    public void method() {
    }
}
//Parent를 상속받은 FirstChild와 SecondChild의 method()는 다른 기능 수행해도 무관

 

Overriding

  • 부모 클래스에 선언된 메서드와 동일한 선언을 가지나 구현은 다름(덮어씀)
  • 자바에서 다형성 제공하는 하나의 방법
public class Parent {
    public void method() {
    }
}

public class Child extends Parent {
    public void method() { //Overriding
    }
}

 

Overloading

  • 메서드 이름은 동일해도 매개 변수를 다르게 함
  • 동일한 기능을 하지만 메서드에 넘겨줄 수 있는 매개 변수 타입을 다양하게 함
public class Overloading {
    public void getData() {
    }
    public void getData(int value) {
    }
    public void getData(String value) {
    }
}
  • 메서드의 매개 변수에 따라 셋 중 호출되는 메서드가 달라짐

 

자바의 주석문(comment)

한 줄 주석

  • 일반적으로 해당 줄을 실행하지 않게 할 때 사용
//주석 처리 내용

블록 주석

  • 여러 줄 실행하지 않게 할 때 사용
/* 주석 시작
여기에 있는 문장들은 모두 무시됨
주석 끝 */

javadoc 위한 주석

  • API 문서에 설명 표시할 목적으로 사용
/** 주석 시작
여기에는 해당 클래스나 메서드 설명 있어야 함
주석 끝 */

 

패키지

  • package
  • 클래스 그룹화하기 위한 단위

패키지 선언 시 유의사항

  • 패키지는 package로 시작해 하위 패키지로 내려갈 때마다 . 찍어줘야 함
  • 반드시 소스의 가장 첫 줄에 존재해야
  • 패키지 이름에 자바 예약어 포함 x
  • 모두 소문자로 구성하는 것이 일반적
  • 일반적인 패키지는 java나 javax로 시작하면 x
  • 패키지에 해당하는 폴더에 클래스가 존재하는 것이 일반적
package com.roadbook.godofjava;

 

import

  • 다른 패키지에 있는 클래스 사용하기 위한 문장
  • 다른 클래스에 static으로 선언된 접근 가능한 변수 참조하려면 import static 사용
  • 하나의 패키지 내에 있는 모든 클래스 참조 시 * 사용
import com.roadbook.godofjava.SummaryClass;
import static com.roadbook.godofjava.SummaryClass.SUMMARY_CHAPTER_NUMBER;
import com.roadbook.godofjava.exception.*;

 

자바에서의 타입의 종류

기본 자료형(Primitive type)

  • 종류
정수형 소수형 기타
byte / short / int / long / char float / double boolean

 

  • 정수형 값 범위
타입 최소 최대 비트 수
byte -27 27 - 1 8
short -215 215 - 1 16
int -231 231 - 1 32
long -263 263 - 1 64
char 0 216 - 1 16

 

  • 기본값
byte short int long float double char boolean
0 0 0 0L 0.0f 0.0d '\u0000' false

 

참조 자료형(Reference type)

  • 기본 자료형 제외한 모든 타입
  • 모든 클래스 = 참조 자료형

 

기본 자료형 참조 자료형
초기화할 때
바로 값 지정 일반적으로 new와 생성자 지정해 객체 생성
메서드 호출 시 매개 변수
값 전달 참조 자료형 안의 변수들은 참조 주소 전달

 

특수한 참조 자료형, String 클래스
new 이용해 객체 생성할 필요 없는 특수한 클래스
+ 연산까지 가능한 유일한 클래스

 

변수 종류

지역 변수
(local variable)
매개 변수
(parameter)
인스턴스 변수
(instance variable)
클래스 변수
(class variable)
지역 변수 선언한 곳에서부터 생명 시작
지역변수 선언한 중괄호 끝나면 소멸
메서드 호출 시 생명 시작
메서드 끝나면 소멸
(호출한 메서드에서 넘겨준 참조 자료형은 그대로 살아있음)
객체 생성 시 생명 시작
그 객체 참조하고 있는 다른 객체 없으면 소멸
클래스 생성될 때 생명 시작
자바 프로그램 끝날 때 소멸
public class VariableTypes {
    int instanceVariable;
    static int classVariable;
    public void method(int parameter) {
        int localVariable;
    }
}

 

연산자

할당 연산자 사칙 연산자 대입 연산자 단항 연산자 비교 연산자
= +(덧셈), -(뺄셈), *, /, % +=, -=. *=, /=, %= +(양수), -(음수), ++, -- ==, !=, >, <, >=, <=

 

조건적 논리 연산자 논리 연산자 삼항 연산자 Bitwise 연산자 Bit 이동 연산자 Bit 대입 연산자
&&, || !, &, |, ^ ? : &(AND), |(OR), ^(XOR), ~(NOT) <<, >>, >>> &=, |=, ^=, <<=, >>=, >>>=

삼항 연산자

변수 = (boolean 조건식) ? true일 때 값 : false일 때 값;

 

조건문

if문

//if
if(boolean값) {
    처리 문장;
}

//if-else
if(boolean값) {
    처리문장1;
} else {
    처리문장2;
}

//if-else if
if(boolean값) {
    처리문장1;
} else if(boolean값) {
    처리문장2;
} else if(boolean값) {
    처리문장3;
}
...
} else {
    처리문장n;
}

switch문

  • 비교 대상 변수 : 정수형만 가능했으나 JDK 7 이상에서는 String도 사용 가능
switch(비교대상변수) {
    case 점검값1:
        처리문장1;
        ...
        break;
        
    case 점검값2:
        처리문장2;
        ...
        break;
    ...
    default:
        기본처리문장;
        ...
        break;
}

 

반복문

while문

//while
while(boolean 조건이 true일 때 실행) {
    ...
}

//do-while
//반복 수행하기 전, 적어도 한 번은 처리할 필요가 있을 때
do {
    처리문장;
    ...
} while(boolean 조건이 true일 때 실행);

for문

//문법
for(초기화; 종료조건; 증감식) {
    반복문장
}
//예시
for(int i = 0; i < 100; i++) {
    i++;
}

break와 continue

  • break: 조건 빠져나가기 위한 조건(반복문 중간에 하던 작업 중단)
  • continue: 검증 로직으로 이동(반복문 중간에 하던 작업 중단 후 조건 확인하는 부분으로 바로 이동)
int x = 1;
while(x < 3) {
    x++;
    if(x == 1) {
        continue;
    }
    if(x == 2) {
        break;
    }
}

 

접근 제어자

  해당 클래스 안에서 같은 패키지에서 상속 받은 클래스에서 import한 클래스에서
public O O O O
protected O O O X
(package private) O O X X
private O X X X

 

선언 시 사용할 수 있는 각종 제어자

제어자 클래스 메서드 변수
접근 제어자 : public, protected, private O O O
구현 필요 제어자 : abstract O O X
하나의 인스턴스만 허용하는 제어자 : static O O O
값 수정 제한 제어자 : final O O O
strict 소수 값 제어자 : strictfp O O X
어노테이션 O O O
동시 접근 제어자 : synchronized X O X
다른 언어로 구현된 것을 명시하는 제어자 : natvie X O X
실행 시의 동작 방법을 알리는 제어자 : transient, volatile X O O

 

자바에서 만든 코드 관리하는 클래스 파일(.class)이 되는 타입 종류

  • 클래스
  • 인터페이스
  • abstract 클래스
  • enum 클래스
  • 어노테이션 선언 클래스

 

인터페이스 vs abstract 클래스 vs 클래스

  인터페이스 abstract 클래스 클래스
선언 시 사용하는 예약어 interface abstract class class
구현 안된 메서드 포함 가능 여부 O (필수) O X
구현된 메서드 포함 가능 여부 X O O (필수)
static 메서드 선언 가능 여부 X O O
final 메서드 선언 가능 여부 X O O
상속(extends) 가능 X O O
구현(implements) 가능 O X X
클래스 변수, 인스턴스 변수 선언 가능 여부 O O O

 

  • 클래스 선언 예시
public class Sample extends SuperClass implements InterfaceA, InterfaceB {
    ...
}
  • 인터페이스 선언 예시
public interface InterfaceA {
    public void methodA();
    public void methodB();
}
  • abstract 클래스 선언 예시
public abstract class AbstractClass {
    public abstract void methodC();
    public void methodD() {
    }
}
  • enum 클래스 선언 예시
public enum EnumClass {
    THREE_HOUR(18000),
    FIVE_HOUR(30000),
    /* 중간 생략 */
}

enum 클래스

  • 상수 열거 위한 용도로 사용
  • 여기서의 상수는 이름만 정의해도 됨
  • 별도 생성자 만들어 각 상수 값 지정 가능
  • 모든 enum 클래스의 부모 클래스 = java.lang.Enum 뿐
  • enum에 메서드 만들어 기능 추가 가능

 

  • 어노테이션 선언 예
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationDefinition {
    public int number();
    public String text() default "This is first anotation";
}
  • 대상(@Target)과 적용 범위(@Retention) 명시하는 게 좋음
  • @interface 사용해 어노테이션이라는 것을 명시

 

메서드

  • 자바에서 클래스의 행위(behavior) 처리하는데 사용됨

 

상속

장점

  • 리팩토링 단계 거쳐 반복되는 메서드를 상위 클래스로 구분해주는 게 좋음
  • 코드 재사용성, 유지 보수성, 가독성 높아짐

상속 관계 발생 시

생성자

  • 자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 매개 변수가 없는 기본 생성자가 호출됨(이를 super()라고 명시적 지정 가능)
  • 부모 클래스의 생성자를 명시적 호출하려면 super() 사용

메서드

  • 부모 클래스에 선언된 메서드가 자신의 클래스에 선언된 것처럼 사용 가능(private 제외)
  • 부모 클래스에 선언된 메서드와 동일한 시그니처 사용하여 메서드 overriding 가능
  • 부모 클래스에 선언 안 된 이름의 새로운 메서드 선언 가능

변수

  • 부모 클래스에 private으로 선언된 변수 제외한 모든 변수가 자신의 클래스에 선언된 것처럼 사용 가능
  • 부모 클래스에 선언된 변수와 동일한 이름 가지는 변수 선언 가능(권장 x)
  • 부모 클래스에 선언 안 된 이름의 변수 선언 가능

 

예외

try-catch 구문

try {
    //예외 발생 가능한 문장
} catch(예외1 e1) {
    //예외1 발생할 때 처리 문장
} catch(예외2 e2) {
    //예외2 발생할 때 처리 문장
} finally {
    //try나 catch에 상관 없이 수행되는 문장
}

 

자바에서의 예외 종류

checked exception error runtime exception
(unchecked exception)
try-catch로 묶어줘야 하는 예외
컴파일 시 예외 처리 여부 체크
자바 프로세스에 영향 주는 예외
실행 시 발생
try-catch로 묶지 않아도 컴파일 시 체크하지 않는 예외
실행 시 발행하는 예외

 

throw와 throws

throw throws
예외 객체 던지기 위해 사용 예외 발생 시 던질 것이라고 메서드 선언 시 사용
  • 메서드 선언 시 매개 변수 소괄호 뒤에 throws 예약어 적은 뒤 예외 선언하면, 해당 메서드에서 선언한 예외 발생 시 호출한 메서드로 예외 전달됨
  • 두 가지 이상의 예외 던지면 implements처럼 콤마로 구분해 예외 클래스 이름 적어줌
  • try 블록 내에서 예외 발생시킬 경우 throw라는 예약어 적은 뒤 예외 객체 생성하거나, 생성된 객체 명시
  • throw한 예외 클래스가 catch 블럭에 선언 안 되어 있거나, throws 선언에 포함 안 되어 있으면 컴파일 에러 발생
  • catch 블럭에서 예외 throw할 때 메서드 선언의 throws 구문에 해당 예외가 정의되어 있어야 함

 

Object 클래스

  • 모든 클래스의 가장 최상위 부모 클래스
  • 이 클래스에 선언된 모든 메서드 = 자바에서 사용하는 모든 클래스에서 사용 가능

 

Object 클래스의 주요 메서드

메서드 설명
clone() 객체의 복사본 만들어 리턴
equals() 현재 객체와 매개 변수로 넘겨받은 객체가 같은지 확인
finalize() 현재 객체가 더는 쓸모 없어지면 가비지 컬렉터(garbage collector)에 의해 이 메서드 호출됨
getClass() 현재 객체의 Class 객체 리턴
hashCode() 객체에 대한 해시 코드(hash code) 값 리턴
String toString() 객체를 문자열로 표현하는 값 리턴
wait(), notify(), notifyAll() 쓰레드 처리 시 사용하는 메서드

 

String 클래스

특징

  • new 사용해 객체 생성 가능
  • 더하기 연산 가능
  • 더하기 연산 시 String 클래스는 기존 문자열 버리고 새로운 객체 생성

주요 메서드

메서드 설명
getBytes() 문자열을 byte 배열로 변경
length() 문자열 길이 리턴
isEmpty() 문자열 비어있는지 확인
equals() 두 문자열의 값이 같은지 확인
startsWith(), endsWith() 매개 변수로 넘어온 문자열로 시작하는지, 끝나는지 확인
contains() 매개 변수로 넘어온 문자열이 포함되어 있는지 확인
indexOf(), lastIndexOf() 매개 변수로 넘어온 문자열이 있는 위치를 0부터 시작하는 값으로 리턴, 만약 없으면 -1 리턴
substring(), subsequence() 문자열의 특정 범위의 값 잘라서 리턴
split() 문자열을 매개 변수로 넘어온 정규 표현식에 따라 String 배열로 리턴
concat() 기존 문자열 뒤에 매개 변수로 넘어온 문자열 합침
trim() 문자열 맨 앞과 뒤에 있는 공백 제거
replace() 문자열 특정 위치의 내용을 매개 변수로 넘어온 값으로 변경
format() 문자열을 정해진 포맷으로 변환
intern() 절대 쓰면 안 되는 메서드

 

StringBuffer와 StringBuilder 클래스

StringBuffer 클래스 StringBuilder 클래스
쓰레드에 안전 쓰레드에 안전하지 x
String의 단점 보완하기 위해 제공되는 클래스
append() 메서드 사용해 문자 더할 수 있음
만약 문자열 더하면 컴파일러에서 StringBuilder 클래스로 변환시킴

 

JDK에 선언된 어노테이션

@Override @Deprecated @SuppressWarnings
Override한다는 것을 명시적으로 선언 시 사용 더는 사용하지 않아 Deprecated된 것을 명시적으로 선언 시 사용 컴파일러의 경고 무시하도록 할 때 사용

 

메타 어노테이션

  • 어노테이션 선언 시 사용

@Target

요소 타입 대상
CONSTRUCTOR 생성자 선언 시
FIELD enum 상수 포함한 필드(field)값 선언 시
LOCAL_VARIABLE 지역 변수 선언 시
METHOD 메서드 선언 시
PACKAGE 패키지 선언 시
PARAMETER 매개 변수 선언 시
TYPE 클래스, 인터페이스, enum 등 선언 시
@Target({ElementType.METHOD, ElementType.TYPE})

@Retention

  • RetentionPolicy 종류
요소 타입 대상
SOURCE 어노테이션 정보가 컴파일 시 사라짐
CLASS 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해 참조 가능함
But 가상 머신(Virtual Machine)에서는 사라짐
RUNTIME 실행 시 어노테이션 정보가 가상 머신에 의해 참조 가능

@Documented
@Inherited

'Backend > Java' 카테고리의 다른 글

[자바의 신] 20장  (0) 2022.07.26
[자바의 신] 19장  (0) 2022.07.26
[자바의 신] 17장  (0) 2022.07.25
[자바의 신] 16장  (0) 2022.07.25
[Java] String ➡ Long 타입으로 형변환  (0) 2022.03.30

댓글