Java/자바의 신 VOL.1
18. 이제 기본 문법은 거의 다 배웠으니 정리해봅시다
h2boom
2024. 6. 26. 13:34
객체지향 개발과 관련된 용어들
- 클래스 (class) : "상태"와 "행위"를 갖는 자바의 기본 단위
- 상태 (state) = 변수
- 행위 (behavior) = 메소드
- 추상 클래스 (abstract class) / 클래스 (class) / 인터페이스 (interface)
- 클래스 파일(.class)이 되는 타입의 종류
- 클래스
- 인터페이스
- abstract 클래스
- enum 클래스
- 어노테이션 선언 클래스
- 추상 클래스 (abstract class) / 클래스 (class) / 인터페이스 (interface) 차이점
- 인터페이스
- 메소드가 선언만 되어 있다.
- 구현되어 있는 메소드가 존재하면 안된다.
- 인터페이스를 구현 시 implements를 사용해 구현한다.
- 추상 클래스
- 구현되어 있는 메소드가 존재해도 상관없다.
- abstract로 선언된 메소드가 1개 이상인 경우 반드시 abstarct 클래스로 선언해야한다.
- abstract로 선언된 메소드는 절대 구현되어 있으면 안된다.
- 추상 클래스를 확장 시 extends를 사용해 확장한다.
- 클래스
- 모든 메소드가 구현되어 있어야한다.
- 추상 클래스, 인터페이스 모두 클래스 / 인스턴스 변수를 선언할 수 있다.
- 구현 / 상속받는 클래스에서 이 값들을 사용할 수 있다.
- 인터페이스
- 클래스 선언
- public class 명과 자바 파일 명은 일치해야한다.
- 클래스 명은 대문자로 시작하고 각 단어의 첫 문자는 대문자를 사용한다.
- 접근 제어자를 사용해 선언할 수 있다.
- public class 명과 자바 파일 명은 일치해야한다.
- 클래스 상속 (확장)
- extends 뒤에 부모 클래스의 이름을 명시한다.
- 반드시 하나의 클래스만 상속(확장) 가능하다.
- abstract 클래스도 상속 가능하다.
- 인터페이스 선언
- 인터페이스에 선언된 메소드 중 구현된 메소드가 존재하면 안된다.
- 인터페이스 구현
- 한 개 이상의 구현할 인터페이스 명을 implements 뒤에 명시한다.
- 인터페이스 구현 시 인터페이스에 선언된 모든 메소드를 구현해야한다.
- abstract 클래스 선언
- abstract 메소드가 하나라도 있을 경우 무조건 abstract 클래스로 선언한다.
- abstract 메소드가 없어도 abstact 클래스로 선언할 수 있다.
- enum 클래스 선언
- enum 클래스는 상수를 열거하기 위한 용도
- enum 클래스의 상수는 이름만 정의할 수 있다.
- 별도의 생성자를 만들어 각 상수의 값을 지정 가능
- java.lang.Enum 클래스는 모든 enum 클래스의 부모 클래스
- enum 클래스에 메소드를 만들어 기능 추가 가능
- 어노테이션 선언
- @Target(대상)과 @Retention(적용범위)를 명시하는 것이 좋다.
- @interface로 어노테이션이라는 것을 명시한다.
- 클래스 파일(.class)이 되는 타입의 종류
- 캡슐화 (Encapsulation) : 연관된 "상태"와 "행위"를 묶어주는 것, 정보은닉과 모듈화가 가능해진다.
- 정보은닉 : 기능을 클래스 밖에서 접근 가능한 대상을 제한하는 것.
- 모듈화: 하나의 객체를 위한 코드가 다른 객체를 위한 코드와 무관하게 수행할 수 있는 것.
- 묶여 있는 가장 작은 단위를 "클래스"라고 한다.
public class Common {
private int state; //private으로 선언함으로 정보 은닉
public void setState(int state){
//상태를 변경 가능
}
}
- 메시지 (Message) : 메소드에서 다른 메소드를 호출할 때 전달하는 값을 의미
- 메소드를 호출할 때 넘겨주는 매개 변수들이 메시지에 속한다
- 객체 (Object) : 클래스는 "사물의 단위"를 의미하지만 객체는 각 "사물"을 의미한다.
- 상속 (Inheritance) : 부모에 선언된 변수와 메소드에 대한 사용권을 갖는 것을 의미한다.
- 클래스 선언 시 extends를 사용해 확장하는 경우
implements를 사용해 구현하는 경우 - 코드의 재사용성과 유지 보수성, 가독성이 높아진다.
- 생성자
- 자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 기본 생성자가 호출된다.
- super()로 명시적으로 생성자 지정이 가능하다.
- super()는 자식 생성자 맨 위에 작성해야 한다.
- 메소드
- 부모 클래스에 선언된 메소드 중 private을 제외한 모든 메소드 사용 가능
- 부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로 메소드 Overriding이 가능하다.
- 부모 클래스에 선언되지 않은 새로운 메소드를 선언 가능하다.
- 변수
- 부모 클래스에 선언된 private 변수를 제외하고 모든 변수 사용 가능
- 부모 클래스에 선언된 변수와 같은 이름의 변수 선언 가능 (권장하지 않음), 다른 이름의 변수도 선언 가능
- 클래스 선언 시 extends를 사용해 확장하는 경우
- 다형성 (Polymorphism) : 부모 클래스에서 파생된 자식 클래스들의 기능이 각기 다를 수 있다는 것을 의미한다.
- 부모 클래스에게 상속 받은 자식 클래스들이 부모 클래스의 메소드 Overriding 시 같은 메소드라도 다른 기능을 수행하도록 해도 상관 없다.
- 오버라이딩 (Overriding) : 부모 클래스에 선언되어 있는 메소드와 동일한 선언을 갖지만 구현이 다른 것을 의미한다.
- 다형성을 제공하는 방법 중 하나
- 오버로딩 (Overloading) : 메소드의 이름은 동일하게, 매개 변수들은 다르게 선언하는 것을 의미한다.
- 동일한 기능은 제공하지만 메소드에 넘겨줄 수 있는 매개 변수의 타입을 다양하게 함으로 메소드를 사용하는 다른 개발자들이 쉽게 구현할 수 있게 도와준다.
- 주석문 (Comment) : 개발하면서 부연 설명을 추가하거나, 개발해 놓은 코드를 임시로 수행하지 않게 하려고 사용
- 한 줄 주석 // : 일반적으로 해당 줄을 실행하지 않도록 할 때 사용
- 블록 주석 /* */ : 여러 줄을 실행하지 않도록 할 때 사용
- javadoc을 위한 주석 /** */ : API 문서에 설명을 표시할 목적으로 사용, 클래스나 메소드의 설명을 적는다.
- 패키지 (Package) : 클래스들을 그룹화하기 위한 단위
- 다른 패키지에 선언되어 있는 클래스를 사용하기 위해서 클래스 선언 이전에 import 문장들을 명시해야 한다.
- 패키지 선언 시 유의사항
- package로 시작하며 하위 패키지로 내려갈 때마다 .을 찍어줘야 한다.
- 소스의 가장 첫 줄에 존재해야 한다.
- 자바 예약어가 포함되면 안된다.
- 모두 소문자로 구성한다.
- java, javax로 시작해서는 안된다.
- import 유의사항
- 다른 패키지에 있는 클래스를 사용하기 위한 문장
- 다른 클래스에 static으로 선언된 변수 / 메소드를 참조하려면 import static을 사용한다.
- 하나의 패키지 내에 있는 모든 클래스를 참조하려면 *을 사용한다.
- 자료형 (Data Type)
- 8개의 기본 자료형
- 정수형 : byte, short, int, long, char
- 정수형 값의 범위는 순서대로 8, 16, 32, 64, 16bit로 char만 unsigned로 음수가 없다.
- 정수형의 기본 값은 char 만 '\u0000', 나머지는 0
- 실수형 : float, double
- 실수형의 기본 값은 0.0f / 0.0d
- 기타 : boolean
- boolean의 기본 값은 false
- 정수형 : byte, short, int, long, char
- 참조 자료형 : 기본 자료형을 제외한 모든 타입
- 모든 클래스는 참조 자료형이다.
- 기본 자료형과의 차이점
- 초기화할 때 : 기본 자료형은 값을 바로 지정하지만 참조 자료형은 new와 생성자를 지정해 객체를 생성한다.
- 매개 변수로 전달 시 : 기본 자료형을 매개 변수로 전달 시 원본 값을 복사해 전달(Pass By Value)하기에 값이 변하더라도 원본에 영향을 미치지 않는다.
참조 자료형은 원본의 참조 주소를 전달(Pass By Reference)하기에 값이 변경되면 원본에 영향을 미친다.
- 특수한 참조 자료형 String
- new를 이용해 객체를 생성할 필요가 없는 특수한 클래스.
- + 연산이 가능한 유일한 클래스.
- 8개의 기본 자료형
- 변수 (Variable)
- 지역 변수 (local variables) : 지역 변수를 선언한 중괄호부터 생명이 시작되고 중괄호가 끝나면 소멸된다.
- 매개 변수 (parameters) : 메소드가 호출될 때 생명이 시작되고 메소드가 끝나면 소멸된다.
- 인스턴스 변수 (instance variables) : 객체가 생성될 때 생명이 시작되고 객체를 참조하는 다른 객체가 없으면 소멸된다.
- 클래스 변수 (class variables) : 클래스가 생성될 때 생명이 시작되고 자바 프로그램이 끝날 때 소멸된다.
- 연산자 (Operator)
- 할당 연산자 : =
- 사칙 연산자 : +, -, *, /, %
- 대입 연산자 : +=, -=, *=, /=, %=
- 단항 연산자 : +, -, ++, -- (+, -는 양수 음수를 나타내는 연산자)
- 비교 연산자 : ==, !=, >, <, >=, <=
- 조건적 논리 연산자 : &&, ||
- 논리 연산자 : !, &, |, ^
- 삼항 연산자 : ?:
- Bitwise 연산자 : &(AND), |(OR), ^(XOR), ~(NOT)
- Bit 이동 연산자 : <<, >>, >>>
- Bit 대입 연산자 : &=, |=, ^=, <<=, >>=, >>>=
- 조건문 (Conditional Statement) : 변수들의 상태에 따라 프로그램을 분기할 필요가 있을 때 사용한다.
- if, if-else, if-else if, switch 조건문이 있다.
if (boolean 값) 처리문장;
=============================
if (boolean 값) { 처리문장1; }
else { 처리문장2; }
=============================
if (boolean 값) { 처리문장1; }
else if (boolean 값) { 처리문장 2;}
else { 처리문장3; }
=============================
switch(비교대상변수) {
case 점검값1:
처리문장1;
break;
default:
기본처리문장;
break;
}
- 반복문 (Loop) : 반복되는 작업을 처리하기 위해 사용한다.
- while, do-while, for 반복문이 있다.
- break : 조건문 / 반복문 중간에 하던 작업을 중단, 중괄호 밖으로 이동
- continue : 반복문에서 중간에 하던 작업을 중단, 조건을 확인하는 부분으로 이동
//boolean 조건이 true일 경우에 실행
while (boolean 조건){
처리문장;
}
=========================
//무조건 한 번은 처리문장이 실행되며 boolean 조건이 true일 때 실행
do {
처리문장;
} while (boolean 조건);
=========================
for (초기화; 종료조건; 조건값 증감) {
반복문장;
}
- 접근 제어자 (Access Modifier)
- public : 누구나 접근 가능하다.
- protected : 같은 패키지 내 / 상속 받은 경우 접근 가능하다.
- package-private : 아무런 접근 제어자를 적지 않은 경우에 사용되며 같은 패키지 내에서 접근 가능하다.
- private : 해당 클래스 내에서 접근 가능하다.
- 클래스 / 메소드 / 변수 선언 시 사용할 수 있는 각종 제어자
- 접근 제어자 (public, protected, package-private, private) : 모두 사용가능
- 구현 필요 제어자 (abstract) : 변수는 사용불가
- 하나의 인스턴스만 허용하는 제어자 (static) : 모두 사용가능
- 값 수정 제한 제어자 (final) : 모두 사용가능
- strict 소수 값 제어자 (strictfp) : 변수는 사용불가
- 어노테이션 : 모두 사용가능
- 동시 접근 제어자 (synchronized) : 메소드만 사용가능
- 다른 언어로 구현된 것을 명시하는 제어자 (native) : 메소드만 사용가능
- 실행시 동작 방법을 알리는 제어자 (transient, volatile) : 클래스는 사용 불가
- 메소드(Method)의 선언
- 메소드 선언 시 메소드 명, 리턴 타입, 메소드 내용은 필수로 선언해야 한다.
- 메소드의 매개 변수로 여러 개의 매개 변수를 지정하기 위해 ,로 구분한다.
- 한 타입의 변수를 여러 개 넣기 위해서 변수타입...변수명으로 지정 가능하다.
public void method (String param, int...params){
//메소드 내용
}
- 예외 처리
- 발생 가능한 예외를 처리하는 try-catch 문장이 있다.
- try { 예외발생 가능한 문장 }
catch (예외타입 객체) {예외 발생시 처리 문장}
finally { 예외 발생과 상관 없이 실행되는 문장} - 예외의 종류
- checked exception : try-catch로 묶어줘야하며 컴파일 시 예외 처리 여부를 체크
- error : 자바 프로세스에 영향을 주는 예외, 실행 시 발생한다.
- unchecked exception : try-catch로 묶지 않아도 컴파일 시 예외가 발생하지 않으며 실행 시 발생한다.
- throw / throws
- throw : 예외 객체를 던지기 위해 사용
- try 블록 내에서 예외를 발생시킬 경우 throw 예외 객체를 생성 / 생성된 예외 객체 명시
- throw한 예외 클래스가 catch 블록에 선언되어 있지 않거나, throws 선언에 포함되지 않은 경우 컴파일 에러가 발생한다.
- catch 블록 내에서 throw할 경우 throws 구문에 해당 예외가 정의되어 있어야 한다.
- throws : 예외가 발생하면 던질 것이라고 메소드 선언 시 사용
- 메소드 선언 시 매개 변수 소괄호 뒤에 throws 예외 선언
- throws로 선언한 메소드에서 해당 예외가 발생하면 호출한 메소드로 예외가 전달된다.
- 두 가지 이상의 예외를 던진다면 ,로 구분
- throw : 예외 객체를 던지기 위해 사용
- Object 클래스
- 모든 클래스의 가장 최상위 부모 클래스
- Object 클래스의 모든 메소드를 모든 클래스에서 사용할 수 있다.
- clone() : 객체의 복사본을 만들어 리턴한다.
- equals() : 현 객체와 매개 변수의 객체가 같은지 확인한다.
- finalize() : 현 객체가 쓸모 없어지면 가비지 컬렉터에 의해 호출되는 메소드
- getClass() : 현 객체의 클래스를 리턴한다.
- hashCode() : 객체의 해시 코드 값을 리턴한다.
- toString() : 객체를 문자열로 표현한느 값을 리턴한다.
- wait(), notify(), notifyAll() : 쓰레드 처리시 사용하는 메소드
- String 클래스
- new를 사용하지 않고 객체를 생성할 수 있는 유일한 클래스
- 더하기 연산이 가능하다.
- 더하기 연산 시 기존 문자열 객체를 버리고 새로운 객체를 생성한다.
- String 클래스의 주요 메소드
- getBytes() : 문자열을 byte 배열로 변경한다.
- length() : 문자열의 길이를 리턴한다.
- isEmpty() : 문자열이 비었는지 확인한다.
- equals() : 문자열 값이 같은지 확인한다.
- startsWith(), endsWith() : 매개 변수로 넘어온 문자열로 시작 / 끝나는지 확인한다.
- contains() : 매개 변수로 넘어온 문자열이 포함되어 있는지 확인한다.
- indexOf(), lastIndexOf() : 매개 변수로 넘어온 문자열이 있는 index를, 존재하지 않으면 -1을 리턴한다.
- substring(), subsequence() : 문자열의 특정 범위 값을 잘라서 리턴한다.
- split() : 문자열을 매개 변수로 넘어온 정규표현식에 따라 String 배열로 리턴한다.
- concat() : 기존 문자열 뒤에 매개 변수로 넘어온 문자열을 합친다.
- trim() : 문자열 맨 앞과 뒤의 공백을 제거한다.
- replace() : 문자열 특정 위치의 내용을 매개 변수로 넘어온 값으로 변경한다. (원본 수정x)
- format() : 문자열을 정해진 포맷으로 변환한다.
- intern() : new로 객체를 생성하더라도 Pool에 등록된 값을 찾고 없으면 등록하는 메소드로 성능 저하로 인해 절대로 사용해서는 안되는 메소드.
- 어노테이션 (Meta Annotation)
- JDK에 선언되어 있는 어노테이션
- @Override : Override 한다는 것을 명시적으로 선언
- @Deprecated : 더 이상 사용하지 않아 Deprecated 된 것을 명시적으로 선언
- @SupressWarnings : 컴파일 경고 무시
- 메타 어노테이션
- @Target : 어노테이션 적용 대상 지정
- @Retention : 어노테이션 적용 범위를 지정
- @Documented : 어노테이션 정보가 JavaDocs에 포함된다는 것을 명시
- @Inherited : 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용할 수 있다는 것을 명시
- JDK에 선언되어 있는 어노테이션