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 |
댓글