CH6. 클래스 (1)

a.rubz·2022년 12월 28일
0

이것이 자바다

목록 보기
7/15
post-thumbnail
post-custom-banner

📝 정리

OOP

Object Oriented Programming

객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법

객체

물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것

예) 자동차, 책, 강의, 주문 ...

객체 = 속성(필드) + 동작(메소드)


✔ 객체의 상호작용

  • 객체들은 메소드를 이용해서 다른 객체와 서로 상호작용하면서 동작

  • 메소드 호출을 통해 객체들은 데이터를 서로 주고받음

  • 매개값 : 메소드가 실행할 때 필요한 값

  • 리턴값 : 메소드의 실행의 결과, 호출한 곳으로 돌려주는 값


✔ 객체 간의 관계

  • 집합 관계 : 완성품과 부품의 관계 / 예) 자동차 - 엔진, 타이어...

  • 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계 / 예) 사람 - 자동차

  • 상속 관계 : 부모와 자식 관계 / 예) 기계(부모) - 자동차(자식)



객체 지향 프로그래밍의 특징

  • 캡슐화
  • 상속
  • 다형성

캡슐화 (Encapsulation)

  • 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것

  • 외부 객체는 객체 내부의 구조를 알지 못하고, 객체가 노출해서 제공하는 필드와 메소드만 이용 가능

  • 캡슐화의 목적 : 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위해

  • 접근 제한자(Access Modifier) 사용으로 캡슐화 구현

상속 (Inheritance)

  • 부모 객체는 자기가 가지고 있는 필드와 메소드를 자식 객체에게 물려줘 사용할 수 있도록 함
  • 코드의 재사용성을 높여줌
  • 유지 보수 시간을 최소화시켜 줌

다형성 (Polymorphism)

  • 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
  • 프로그램을 구성하는 객체를 바꾸면 프로그램의 실행 성능이 다르게 나옴
  • 자동 타입 변환재정을 통해 구현
  • 자동 타입 변환과 재정은 상속과 인터페이스 구현을 통해 이뤄짐


✔ 객체와 클래스

  • 객체를 생성하려면 설계도에 해당하는 클래스(Class)가 필요
  • 인스턴스(instance) : 클래스로부터 생성된 객체

✔ 클래스 선언

  • 객체 생성을 위한 설계도를 작성하는 작업
  • 생성자(객체를 생성하는 것), 필드(객체가 가질 데이터), 메소드(객체의 동작)로 구성
  • 한 소스 파일에 복수 개의 클래스 선언 가능
  • 바이트코드 파일은 클래스 선언 수만큼 생김 (소스 파일 1개 -> 바이트코드 파일은 소스 파일의 클래스 수만큼 생성)
  • 한 소스 파일에 복수 개의 클래스 선언 시, 소스 파일명과 동일한 클래스만 공개 클래스(public) 선언 가능

✔ 클래스 명명 규칙

  • 첫 문자 대문자
  • 캐멀 스타일
  • 숫자 포함 가능 / 첫 글자 숫자 불가능
  • 특수문자 $, _ 포함 가능

✔ 공개 클래스 (public class) : 어느 위치에 있든지 패키지와 상관없이 사용할 수 있는 클래스


✔ 객체 생성과 클래스 변수

  • 객체 생성 연산자인 new를 통해 클래스로부터 객체 생성
클래스 변수 = new 클래스();

✔ 클래스의 두가지 용도

  • 라이브러리 클래스 : 실행할 수 없으며 다른 클래스에서 이용하는 클래스
  • 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스

클래스의 구성 멤버

  • 필드(Field) : 객체의 데이터를 저장하는 역할
  • 생성자(Constructor) : new 연산자로 객체를 생성할 대 객체의 초기화 역할, 리턴 타입이 없고 이름은 클래스 이름과 동일
  • 메소드(Method) : 객체가 수행할 동작, 객체와 객체간의 상호 작용을 위해 호출


필드

  • 필드는 객체의 데이터를 저장하는 역할
  • 객체의 데이터는 고유 데이터, 현재 상태 데이터, 부품 데이터가 있음
  • 예) 자동차 > 고유 데이터 - 색상, 회사명 / 현재 상태 데이터 - 속도 / 부품 데이터 - 타이어, 엔진

✔ 필드 선언

타입 필드명 [ = 초기값];
  • 변수를 선언하는 방법과 동일
  • 반드시 클래스 블록에서 선언되어야 함
  • 타입은 기본 타입, 참조 타입 모두 가능
  • 필드명은 첫 문자 소문자, 캐멀 스타일
  • 초기값을 제공하지 않을 경우, 객체 생성 시 필드는 자동으로 기본값 초기화

✔ 필드 사용

  • 필드값을 읽고 변경하는 것
  • 객체가 생성된 후에 사용 가능
  • 객체 내부의 생성자와 메소드 내부에서 사용 가능
  • 객체 외부에서도 접근해서 사용 가능 => 객체 접근 연산자 도트(.) 이용


생성자

클래스 변수 = new 클래스();
  • 객체를 생성할 때 클래스()부분이 생성자를 호출하는 것
  • 생성자가 성공적으로 실행이 끝나면 new 연산자는 객체의 주소 리턴

기본 생성자 (Default Constructor)

  • 클래스에 생성자 선언이 없으면 컴파일러가 바이트코드 파일에 자동으로 기본 생성자 추가
  • 개발자가 선언한 생성자가 있으면 기본 생성자 추가 X
  • 개발자는 객체를 다양하게 초기화하기 위해 생성자를 선언

✔ 생성자 선언

클래스(매개변수, ...) {
    //객체의 초기화 코드
}
  • 생성자는 메소드와 비슷한 모양을 가짐
  • 리턴 타입이 없고 클래스 이름과 동일
  • 매개변수를 통해 필드값 설정

this

  • 매개변수명이 필드명과 동일하기 때문에 필드임을 구분하기 위해 사용
  • this는 현재 객체를 의미
  • this.필드명 => 현재 객체의 필드

생성자 오버로딩

  • 매개값으로 객체의 필드를 다양하게 초기화하기 위해 사용
  • 매개변수를 달리하는 생성자를 여러 개 선언하는 것
  • 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정

✔ 다른 생성자 호출

  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복 코드가 발생
  • 공통 코드를 한 생성자에만 집중적으로 작성, 나머지 생성자는 this를 사용해 공통 코드를 가지고 있는 생성자 호출
Car(String model) {
	this(model, "은색", 250);
}

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

Car(String model, String color, int maxSpeed) {
    this.model = model;
    this.color = color;
    this.maxSpeed = maxSpeed;
}


메소드

  • 객체간의 상호작용하는 방법을 정의하는 것
  • 메소드 선언 : 객체의 동작을 실행 블록으로 정의하는 것
  • 메소드 호출 : 실행 블록을 실제로 실행하는 것

✔ 메소드 선언

리턴 타입 메소드명 (매개변수, ...) {
    // 실행할 코드 작성하는 곳
}
  • 리턴 타입
    • 메소드가 실행한 후 호출한 곳으로 전달하는 결과값 타입
    • void : 리턴값이 없는 메소드
    • 리턴 타입이 있는 메소드는 실행 블록 안에서 return문으로 리턴값 반드시 지정

  • 메소드명
    • 소문자로 시작, 캐멀 스타일 작성

  • 매개변수(parameter)
    • 메소드를 호출할 때 전달한 매개값을 받기 위해 사용
    • 매개값이 없다면 매개변수 생략

  • 실행 블록
    • 메소드 호출 시 실행되는 부분

✔ 메소드 호출

  • 메소드 블록을 실행하는 것
  • 객체가 존재해야 메소드 호출 가능
  • 객체 내부 호출 -> 메소드명 호출
  • 외부 객체에서 호출 => 참조 변수, 도트(.) 연산자를 이용해 호출

가변길이 매개변수

  • 메소드 호출 시, 매개변수의 개수에 맞게 매개값 제공
  • 메소드가 가변길이 매개변수를 가지고 있을 때, 매개변수의 개수와 상관없이 매개값을 줄 수 있음
  • 매개값들은 자동으로 배열 항목으로 변환되어 메소드에서 사용됨
// 가변길이 매개변수 선언방법
int sum(int ... values) {
	// 실행블록
}

int result = sum(1, 2, 3);
int result = sum(1, 2, 3, 4);
// 다양한 가변길이 매개변수 사용방법
// 1.
int result = sum(1, 2, 3);

// 2.
int[] values = {1, 2, 3};
int result = sum(values);

// 3.
int result = sum(new int[] {1, 2, 3});

return문

  • 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아감
  • 메소드 선언에 리턴 타입이 있을 경우 return [리턴값];으로 리턴값 지정
  • return문 이후 실행문 작성 => Unreachable code 컴파일 에러 발생

메소드 오버로딩

  • 메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드를 여러 개 선언하는 것
  • 매개변수의 개수 또는 타입이 달라야함
  • 반환타입과는 관계 없음 => 매개변수는 같은데 반환 타입만 다른 경우 오버로드 성립 X
  • [참고] http://www.tcpschool.com/java/java_usingMethod_overloading


💡 스터디

profile
🔥 개발 공부 🔥
post-custom-banner

0개의 댓글