지금을 사는 사람

혼자 공부하는 자바 3주차 본문

스터디/혼공학습단

혼자 공부하는 자바 3주차

지금회 2024. 1. 17. 20:37
728x90

[객체 지향 프로그래밍] 목차

기본미션

* 어렵거나 중요하다고 생각하는 용어를 혼공 용어 노트에 정리하고 공유하기

  • 객체 : 프로그래밍에서 객체는 클래스의 인스턴스입니다. 특정 엔터티와 관련된 데이터와 동작을 캡슐화합니다. 이것은 구조와 기능을 정의하는 청사진이며, 객체는 그 청사진을 기반으로 만든 구체적인 인스턴스입니다.
  • 인스턴스 : 클래스에서 객체를 만들 때 해당 클래스를 인스턴스화하여 인스턴스를 만듭니다.
  • 초기화 : 초기화는 객체의 속성이나 변수의 초기 값을 설정하는 프로세스를 나타냅니다. 객체가 생성되거나 인스턴스화 될 때 발생합니다. 이 단계는 객체가 어떠한 작업이나 메서드를 수행하기 전에 올바른 데이터로 시작되도록 보장합니다
  • 오버로딩 : 오버로딩은 클래스에 동일한 이름을 가진 여러 메서드가 있는 경우 발생합니다. 이를 통해 메서드는 받은 입력에 따라 다른 작업을 수행할 수 있습니다. 이것은 메서드 오버로딩(동일한 이름, 다른 매개변수) 또는 연산자 오버로딩(사용자 정의 타입에 대한 연산자의 동작 변경)일 수 있습니다.

선택미션

  • 객체 지향 프로그래밍의 개념 정리하기
  1. 객체 지향 프로그래밍은 데이터와 동작을 결합하여 객체를 중심으로 코드를 구성하는 것이다.
  2. 클래스: 클래스는 클래스에서 생성된 인스턴스(객체)가 공유하는 구조와 동작을 정의하는 청사진 역할을 합니다.
  3. 캡슐화: 캡슐화는 객체의 내부 세부 정보를 숨기고 잘 정의된 인터페이스(메서드)를 통해서만 데이터에 액세스할 수 있도록 허용합니다.
  4. 상속: 상속을 사용하면 클래스(하위 클래스/파생)가 다른 클래스(수퍼클래스/기본)에서 속성과 동작을 상속하여 코드 재사용을 촉진할 수 있습니다.
  5. 다형성: 다형성을 사용하면 서로 다른 유형의 객체를 공통 유형의 객체로 처리하여 코드를 단순화하고 유연성을 높일 수 있습니다.
  6. 추상화: 추상화는 불필요한 세부 사항 없이 필수 속성과 동작을 모델링하여 복잡한 시스템을 단순화합니다.

Chapter 06 : 클래스

객체 지향 프로그래밍

  • 객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능 한

객체의 상호작용

  • 객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용하면서 동작
  • 메소드(method) : 객체들 사이의 상호작용 수단
    • 리턴값 = 전자계산기객체.메소드(매개값1, 매개값2, ...);
    • 도트 연산자( . ) : 객체의 필드와 메소드에 접근할 때 사용
      int result = Calculator.add(10, 20);

객체 간의 관계

  • 집합 관계 : 객체는 하나의 부품이고 하나는 완성품
    • 자동차와 엔진, 타이어, 핸들의 관계
  • 사용 관계 : 객체 간의 상호작용
    • 사람은 자동차를 사용
  • 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계
    • 자동차(자식)는 기계(부모)의 한 종류

객체와 클래스

  • 클래스 : 설계도, 객체를 생성하기 위한 필드와 메솓드가 정의되어 있음
  • 인스턴스 : 클래스로부터 만들어진 객체
    • 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있음

클래스 선언

  • 식별자 작성 규칙
    • 하나 이상의 문자로 이루어져야 한다. ex) Car, SportsCar
    • 첫 글자에는 숫자가 올 수 없다. ex) Car, 3Car(x)
    • '$', '_' 외의 특수 문자는 사용할 수 없다. ex) $Car, _Car, @Car(x), #Car(x)
    • 자바 키워드는 사용할 수 없다. ex) int(x), for(x)

객체 생성과 클래스 변수

클래스 변수 = new 클래스();
  • 클래스는 두 가지 용도가 있다.
    • 라이브러리(API : Application Program Interface)
    • 실행용 : main() 메소드 제공하는 역할

클래스의 구성 멤버

  • 필드 : 객체의 고유 데이터, 부품 객체, 상태 정보를 저장
  • 생성자 : 초기화를 담당. 클래스 이름으로 되어 있고 리턴 타입이 없음
  • 메소드 : 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행

필드

필드 선언

String company = "현대자동차";
int maxSpeed = 300;
boolean enginStart = false;

필드 사용

  • 필드값을 읽고 변경하는 작업
  • 클래스 외부에서 사용할 경우 클래스 객체를 생성한 뒤 필드를 사용해야 함
    Car myCar = new Car();
    myCar.speed = 60;

생성자

기본 생성자

  • 모든 클래스는 생성자가 반드시 존재하며 하나 이상 가질 수 있음
  • 생성자 선언을 생략 시 기본 생성자를 바이트 코드에 자동 추가

생성자 선언

Car(String model, String color, int maxSpeed) {}

필드 초기화

  • 객체 생성될 때 필드는 기본 초기값으로 자동 설정
  • 초기값을 설정하는 방법 두가지
    • 필드 선언할 때 초기값을 주거나
    • 생성자에서 초기값을 주는것
// 1번
public class Korea {
String nation = "대한민국";
String name;
String ssn;
}

Korean k1 = new Korean();

// 2번
public class Korea {
    String nation = "대한민국";
    String name;
    String ssn;

public Korean(String n, String s) {
    name = n;
    ssn = s;
    }
}

생성자 오버로딩

  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
    Car() { ... }
    Car(String model) { ... }
    Car(String model, String color) { ... }
    Car(String model, String color, int maxSpeed) { ... }
  • 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.

다른 생성자 호출: this()

  • this()는 자신의 다른 생성자를 호출하는 코드
  • 반드시 생성자의 첫 줄에서만 허용된다.
    Car() {
    }
    

Car(String model) {
this(model, "은색", 250);
}

Car(String model, String color) {
this(model, color, 250);
}


## 메소드
- 리턴타입 : 메소드가 리턴하는 결과의 타입
- 메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어준다.
- 매개 변수 선언 : 메소드를 실행할 때 필요한 데이터를 받기 위한 변수 선언
- 메소드 실행 블록 : 실행할 코드 작성

### 메소드 선언
- 리턴 타입 : 리턴값의 타입. 메소드를 실행한 후의 결과값
- 메소드 이름
-- 숫자로 시작하면 안 되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
-- 관례적으로 메소드 이름은 소문자로 작성
-- 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성
- 매개 변수 선언
```java
double divide ( int x, int y ) { ... }
// int x와 int y는 매개 변수
  • 매개 변수의 개수를 모를 경우
    int sum( int[] values) { }

리턴(return)문

  • 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 작성해야한다.
    int plus(int x, int y) {
      int result = x + y;
      return result;
    }
  • void는 리턴값이 없는 메소드이다.

메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
  • 매개 변수의 타입, 개수, 순서 중 하나가 달라야한다.
  • 예시는 상단의 생성자 부분을 참조할 것

인스턴스 멤버와 정적 멤버

인스턴스 멤버와 this

인스턴스멤버

  • 인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드

  • 인스턴스 멤버 선언

    public calss Car {
      int gas;
      void setSpeed(int speed) { ... }
    }
  • 인스턴스 필드는 객체마다 따로 존재하고 인스턴스 메소드는 메소드 영역에 저장되고 공유된다

  • 메소드는 코드블록이므로 객체마다 동일한 코드 블록을 가지고 있을 필요가 없기 때문

    • 인스턴스라는 이름이 붙는 이유는 메모리 블록 내부에 인스턴스 필드 등이 사용되는 경우가 있기 때문

this

  • 객체 자신을 가리키는 것
    Car(String model) {
      this.model = model;
    }
    void setModel(String model) {
      this.model = model;
    }

정적 멤버와 static

정적멤버

  • 정적 멤버 선언

    public class 클래스 {
      // 정적 필드
      static 타입 필드 = 초기값;
    
      //정적 메소드
      static 리턴 타입 메소드( 매개변수선언, ...) { ... }
    }
  • 정적 필드와 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다.

  • 객체마다 가지고 있어야 할 데이터는 인스턴스 필드

  • 그렇지 않은 공용 데이터는 정적 필드로 선언

  • 정적 멤버 사용

    • 클래스.필드;
    • 정적 멤버이므로 인스턴스 객체 없이 사용 가능
    • 인스턴스 객체로도 접근 가능(비권장)
  • 정적 메소드 선언 시 주의할 점

    • 객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없음. this 또한 불가능

싱글톤

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우 사용하는 객체가 싱글톤

  • 외부에서 new 연산자로 생성자를 호출할 수 없도록 막기 위해서 생성자에 private 접근 제한자를 붙여줌

  • 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화한다.

  • 외부에서 싱글톤을 호출 가능하도록 getInstance() 메소드를 정의한다.

      // 정적 필드
      private static 클래스 singleton = new 클래스();
    
      // 생성자
      private 클래스() {}
    
      // 정적 메소드
      static 클래스 getInstance() {
          return singleton;
      }
    }

final 필드와 상수

final 필드

  • final 필드는 초기값이 저장되면 실행 도중 수정할 수 없다.
  • 초기값을 주는 방법은 2가지
    • 필드 선언 시에 주는 방법
    • 생성자에서 주는 방법

상수

  • 불변의 값을 상수(static final)라고 부른다.
  • final 필드는 상수라고 부르지 않는다.
  • final 필드는 객체마다 저장되고 생성자의 매개값을 통해서 여러 값을 가질 수 있기 때문이다.
  • 상수는 staic이면서 final이어야한다.
    • 즉 static final 필드이다.

패키지와 접근 제한자

  • 패키지는 클래스를 유일하게 만들어주는 식별자 역할
  • 상위패키지.하위패키지.클래스 형태

패키지 선언

  • .java 파일 상단에 패키지를 명시한다.
    package 상위패키지.하위패키지;
    

public class ClassName { ... }

- 패키지 이름 규칙
-- 숫자로 시작해서는 안 되고 _, $를 제외한 특수문자를 사용해서는 안된다.
-- java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안된다.
-- 모두 소문자로 작성하는 것이 관례
-- 회사는 도메인 이름으로 짓는다.
- com.samsung.projectname
- com.hyundai.projectname

### import 문
- 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면 import문으로 포함시켜줘야 한다.
- import 상위패키지.하위패키지.클래스이름;
- import 상위패키지.하위패키지.*;
- 주의사항
-- 상위 패키지를 import했다고 해서 하위 패키지까지 import 되는 것은 아니다. 자바는 패키지 전체 이름으로 패키지를 식별하기 때문에 com.hankook과 com.hankook.project를 서로 다른 패키지로 인식한다.

### 접근 제한자
- 접근을 제한하기 위해 사용하는 것
- 클래스 및 인터페이스 그리고 멤버의 접근을 말한다.
- public : 외부 클래스가 자유롭게 사용 가능
- protected : 같은 패키지 또는 자식 클래스에서 사용 가능
- private : 외부에서 사용 불가능
- default : 같은 패키지에서만 사용 가능
728x90

'스터디 > 혼공학습단' 카테고리의 다른 글

혼자 공부하는 자바 5주차  (0) 2024.02.05
혼자 공부하는 자바 4주차  (0) 2024.01.28
혼자 공부하는 자바 2주차  (0) 2024.01.08
혼자 공부하는 자바 1주차  (1) 2024.01.03
혼공학습단 10기 회고  (0) 2023.08.24