Language/Java

Java - 클래스 복습

둉이 2021. 6. 22. 20:13

 

객체(Object)

: 물리적이거나 추상적인 것들 중 다른 것과 식별 가능한 속성

  → 특징

  1. 속성(필드)과 동작(메소드)으로 구성

  ex) 객체 - 사람 

      속성 - 이름, 나이

      동작 - 웃다, 걷다

  2. 객체 모델링: 현실세계의 객체를 소프트웨어의 객체(= 필드 + 메소드)로 정의하는 것

  3. 객체&메소드 호출: 객체에 도트(.) 연산자를 붙여 호출

 

 

객체 간의 관계

1. 집합 관계

: 완성품 객체 내에 여러 객체가 속함

2. 사용 관계

: 객체 간의 상호작용

  ex) 사람이 자동차를 사용 → 달린다, 멈춘다 메소드 호출

3. 상속 관계

: 상위(부모) 객체와 하위(자식) 객체를 갖는 관계

 일반적으로 상위 객체는 종류, 하위 객체는 사물에 해당

  ex) 기계(상위 객체) ↔ 자동차(하위 객체)

 

 

객체지향 프로그래밍(OOP)

: 객체를 모델링하고 집합 관계에 있는 집합 관계와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 개발하는 기법

  → 특징

  1. 캡슐화(Encapsulation)

     : 객체의 필드, 메소드를 하나로 묶어 실제 구현 내용을 감추는 것

      숨긴 데이터와 메소드는 외부에서 접근 불가(외부로 인한 객체의 손상 방지)

      접근 제한자를 사용하여 필드와 메소드의 사용 범위 제한

  2. 상속(Inheritance)

     : 상위 객체의 필드와 메소드를 하위 객체에게 물려주는 것(개발 시간 최소화)

  3. 다형성(Polymorphism)

     : 하나의 타입에 여러 객체를 대입하여 다양한 기능 구현 가능

 

 

클래스(Class)

- 자동차의 설계도와 비슷

- 인스턴스: 클래스로부터 만들어진 객체

- main 메소드가 없는 클래스는 객체 생성 과정을 거쳐 사용해야 함

- new 연산자를 사용하여 클래스로부터 객체 생성

  ex) Student s1 = new Student();

 

 

클래스의 구성

public Class 클래스이름 {
   int fieldName;  // 필드
  클래스이름() {  // 생성자
      ...
   }
   void methodName() {  // 메소드
      ...
   }
   
   ...
   public static void main(String[] args) {  // 선택, 보통은 실행 클래스와 객체 클래스를 분리하므로 잘 안씀
      ...
   }
}

1. 필드

: 객체의 상태를 저장하는 변수, 생성자와 메소드 내에서 사용됨

  필드값 자동 초기화, 생성자와 메소드 밖에 선언

  → 객체가 소멸될 때 소멸

 

2. 생성자

: new 연산자로 호출되는 객체 초기화 담당 블록, 리턴타입 X

  생성자가 실행되면 힙 영역에 객체 생성

  반드시 존재, 하나 이상을 가질 수 있음

  생략 가능(자동 생성)

  매개변수를 가질 수 있음(필드 초기화에 사용)

  클래스의 이름과 반드시 동일해야 함

  → 실행이 끝나면 자동 소멸

 

3. 메소드

: 객체의 동작 블록

 → 실행이 끝나면 자동 소멸

 

 

생성자 오버로딩(Overloading)

: 매개변수를 달리하는 생성자를 여러 개 선언하는 것

// 생성자 오버로딩 예시
public class Car {
   Car() { ... }
   Car(String model) { ... }
   Car(String model, String color) { ... }
   Car(String color, String model) { ... }  // 오버로딩 X(순서만 다르므로)
   ...
}

- 단점: 중복 코드가 많이 생김

  → this() 코드를 사용하여 해결 가능

// this() 예시
public class Car {
   String company;
   String model;
   String color;
   int maxSpeed;

   Car() { ... }
   Car(String model) {
      this(model, "black", 0);
   }
   Car(String model, String color) {
      this(model, color, 0);
   }
   Car(String model, String color, int maxSpeed) {  // 공통 실행 코드
      this.model = model;
      this.color = color;
      this.maxSpeed;
   }
color, String 
model) { ... }  // 오버로딩 X(순서만 다르므로)
   ...
}

 

매개변수의 수를 모를 경우? 배열로 선언

ex) int sum(int[] values) { ... }

    혹은

    int sum(int ...values) { ... }

 

 

메소드 오버로딩

: 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것

  매개변수의 타입, 개수, 순서 중 하나가 달라야 함

 

 

정적 멤버

: 객체를 생성하지 않고 사용이 가능한 필드와 메소드

- 타입 앞에 static을 사용하여 선언

- 메소드의 경우, 인스턴스의 필드를 사용하지 않는다면 정적 메소드로 선언

 

 

정적 초기화 블록

: 선언과 동시에 초기화가 불가능할 때 사용

  내부에서 정적 변수 초기화와 정적 메소드 실행이 가능

static {
   ...
}

 

 

싱글톤(Singleton)

: 단 하나의 객체만 생성 가능하도록 보장

  → 생성자 앞에 private를 붙여 선언, 클래스 내에서 private static을 붙여 정적 필드로 클래스를 선언하고 정적 메소드를 통해 클래스를 리턴하도록 함

// 싱글톤 예시
public class 클래스 {
   private static 클래스 singleton = new 클래스();
   private 클래스() {  }
   static 클래스 getInsatance() {
      return singleton;
   }
}

 

 

final

: 수정 불가, 상속 불가, 필드 선언과 동시에 초기화하거나 생성자에서 초기화

- static final: 상수, 이름은 모두 대문자로 작성

 

 

패키지

: 클래스를 저장 · 관리하는 폴더

- 이름: 상위패키지.하위패키지.클래스 형태, 모두 소문자

 

 

접근 제한자

접근 제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자,  메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
(같은 패키지 + 다른 패키지 중 자식 패키지 내에서 사용 가능)
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스(같은 패키지 내에서 사용 가능)
private 필드, 생성자,  메소드 모든 외부 클래스(클래스 내부에서만 사용 가능)

1. 클래스

: default 혹은 public

 

2. 생성자

: public, protected, default, private

  자동 생성된 생성자의 경우 클래스의 접근 제한자와 같음

 

3. 필드, 메소드

: public, protected, default, private

 

 

Getter/Setter

: 객체 외부에서 객체에 직접 접근하여 데이터를 변경하는 것을 막기 위한 메소드

 

 

어노테이션(Annotation)

ex) @Override, @interface

public @interface AnnotationExample {
   String value();  // 기본으로 생성해주는 엘리먼트(생략 가능)
   String elementName1()
   int elementName2() default 5;
}

- 용도

  1. 코드 문법 에러 체크

  2. 빌드나 배치 시 코드 자동 생성을 위한 정보 제공

  3. 특정 기능 실행

- 특징

  1. interface를 이용하여 선언

  2. 배열 타입 사용 가능

     ex) @controller(value1 = "1", value2 = "2");

  3. 어노테이션이 적용될 대상을 지정할 때에는 @Target 사용

     ex) @Target({ElementType.METHOD})

  4. 생성자를 제외한 필드, 메소드, 클래스에만 적용 가능