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 명과 자바 파일 명은 일치해야한다.
        • 클래스 명은 대문자로 시작하고 각 단어의 첫 문자는 대문자를 사용한다.
      • 접근 제어자를 사용해 선언할 수 있다.
    • 클래스 상속 (확장)
      • extends 뒤에 부모 클래스의 이름을 명시한다.
      • 반드시 하나의 클래스만 상속(확장) 가능하다.
      • abstract 클래스도 상속 가능하다.
    • 인터페이스 선언
      • 인터페이스에 선언된 메소드 중 구현된 메소드가 존재하면 안된다.
    • 인터페이스 구현
      • 한 개 이상의 구현할 인터페이스 명을 implements 뒤에 명시한다.
      • 인터페이스 구현 시 인터페이스에 선언된 모든 메소드를 구현해야한다.
    • abstract 클래스 선언
      • abstract 메소드가 하나라도 있을 경우 무조건 abstract 클래스로 선언한다.
      • abstract 메소드가 없어도 abstact 클래스로 선언할 수 있다.
    • enum 클래스 선언
      • enum 클래스는 상수를 열거하기 위한 용도
      • enum 클래스의 상수는 이름만 정의할 수 있다.
        • 별도의 생성자를 만들어 각 상수의 값을 지정 가능
      • java.lang.Enum 클래스는 모든 enum 클래스의 부모 클래스
      • enum 클래스에 메소드를 만들어 기능 추가 가능
    • 어노테이션 선언
      • @Target(대상)과 @Retention(적용범위)를 명시하는 것이 좋다.
      • @interface로 어노테이션이라는 것을 명시한다.
  • 캡슐화 (Encapsulation) : 연관된 "상태"와 "행위"를 묶어주는 것, 정보은닉과 모듈화가 가능해진다.
    • 정보은닉 : 기능을 클래스 밖에서 접근 가능한 대상을 제한하는 것.
    • 모듈화: 하나의 객체를 위한 코드가 다른 객체를 위한 코드와 무관하게 수행할 수 있는 것.
    • 묶여 있는 가장 작은 단위를 "클래스"라고 한다.
public class Common {
	private int state; //private으로 선언함으로 정보 은닉
    
	public void setState(int state){
		//상태를 변경 가능
	}
}
  • 메시지 (Message) : 메소드에서 다른 메소드를 호출할 때 전달하는 값을 의미
    • 메소드를 호출할 때 넘겨주는 매개 변수들이 메시지에 속한다
  • 객체 (Object) : 클래스는 "사물의 단위"를 의미하지만 객체는 각 "사물"을 의미한다. 
  • 상속 (Inheritance) : 부모에 선언된 변수와 메소드에 대한 사용권을 갖는 것을 의미한다.
    • 클래스 선언 시 extends를 사용해 확장하는 경우
      implements를 사용해 구현하는 경우
    • 코드의 재사용성과 유지 보수성, 가독성이 높아진다.
    • 생성자
      • 자식 클래스의 생성자가 호출되면 자동으로 부모 클래스의 기본 생성자가 호출된다.
      • super()로 명시적으로 생성자 지정이 가능하다.
        • super()는 자식 생성자 맨 위에 작성해야 한다.
    • 메소드
      • 부모 클래스에 선언된 메소드 중 private을 제외한 모든 메소드 사용 가능
      • 부모 클래스에 선언된 메소드와 동일한 시그니처를 사용함으로 메소드 Overriding이 가능하다.
      • 부모 클래스에 선언되지 않은 새로운 메소드를 선언 가능하다.
    • 변수
      • 부모 클래스에 선언된 private 변수를 제외하고 모든 변수 사용 가능
      • 부모 클래스에 선언된 변수와 같은 이름의 변수 선언 가능 (권장하지 않음), 다른 이름의 변수도 선언 가능
  • 다형성 (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
    • 참조 자료형 : 기본 자료형을 제외한 모든 타입
      • 모든 클래스는 참조 자료형이다.
      • 기본 자료형과의 차이점
        • 초기화할 때 : 기본 자료형은 값을 바로 지정하지만 참조 자료형은 new와 생성자를 지정해 객체를 생성한다.
        • 매개 변수로 전달 시 : 기본 자료형을 매개 변수로 전달 시 원본 값을 복사해 전달(Pass By Value)하기에 값이 변하더라도 원본에 영향을 미치지 않는다.
          참조 자료형은 원본의 참조 주소를 전달(Pass By Reference)하기에 값이 변경되면 원본에 영향을 미친다.
      • 특수한 참조 자료형 String
        • new를 이용해 객체를 생성할 필요가 없는 특수한 클래스.
        • + 연산이 가능한 유일한 클래스.
  • 변수 (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로 선언한 메소드에서 해당 예외가 발생하면 호출한 메소드로 예외가 전달된다.
        • 두 가지 이상의 예외를 던진다면 ,로 구분
  • 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 : 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용할 수 있다는 것을 명시

출처: 이상민, <자바의 신 VOL.1> 로드북