[JAVA] 3주차 : 객체, 클래스

INHEES·2023년 8월 15일

Java

목록 보기
4/13
post-thumbnail

Java 문법 3주차 : 객체, 클래스

객체지향 프로그래밍이란?

객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태(filed)와 행위(method)를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

객체란?

  • 객체는 프로그램에서 사용되는 데이터, 식별자에 의해 참조되는 공간을 의미하며 값을 저장할 변수와 작업을 수행 할 메소드를 서로 연관된것들 끼리 묶어 만든 것이다.

  • 객체를 자동차의 필드와 메서드로 표현하면 다음과 같다.

  • 식별 가능한 객체를 소프트웨어의 객체로 설계하는 것을 객체 모델링 이라고 부른다.

사용 관계

사람 객체는 자동차 객체를 사용한다.

포함 관계

타이어, 차문, 핸들 객체는 자동차 객체에 포함되어 있다.

상속 관계

공장에서는 자동차 뿐만 아니라 기차도 생성하며 이 두개는 하나의 공통된 기계시스템인 bluePrint 기능을 모함하기에 기계시스템 객체를 상속받는 상속 관계이다.

객체와 클래스의 관계

  • 객체를 만들기 위해서는 클래스가 필요하다.
  • 클래스를 토대로 생성된 객체를 해당 클래스의 인스턴스라고 부르며 이 과정을 인스턴스화라고 부른다.
  • 동일한 클래스로 여러 개의 인스턴스를 만들 수 있다.

OOP의 특징

  1. 캡슐화(Encapsulation)
  2. 상속(Inheritance)
  3. 다형성(Polymorphism)
  4. 추상화(Abstraction)

특징에 관한 자세한 내용은 아래와 다음 내용에서 다룬다.


클래스 설계

📌 우리가 클래스를 만들기 위해서는 4가지 STEP 이 필요합니다.
  1. 만들려고 하는 설계도를 선언합니다.(클래스 선언)
  2. 객체가 가지고 있어야할 속성(필드)을 정의합니다.
  3. 객체를 생성하는 방식을 정의합니다.(생성자)
  4. 객체가 가지고 있어야할 행위(메서드)를 정의합니다.
//클래스 선언
public class Car {}

//생성자 정의
//반환 타입이 없으며 이름은 클래스와 동일하다.
//기본 생성자는 생략이 가능하다.
public Car() {} // 기본 생성자 (o)
public Car(String company) {} // 기본 생성자 (x) 

객체의 활용

  • 객체는 객체 생성 연산자인 new를 사용하여 클래스로부터 객체를 생성한다.
  • new 연산자 뒤에는 해당 클래스의 생성자 호출 코드를 작성한다.
  • 객체가 생성되면 해당 인스턴스의 주소가 반환되어 클래스의 참조형 변수를 받아준다.
  • 객체는 배열, 컬렉션에도 저장하여 관리가 가능하다.
Car[] carArray = new Car[3];
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
car1.changeGear('P');
carArray[0] = car1;

필드

필드의 초기화는 두가지로 이루어 진다. 객체의 행위인 메서드도 마찬가지이다.

// 외부 접근
Car car = new Car();
car.color = "blue";

// 내부 접근
double brakePedal() {
    speed = 0;
    return speed;
}

method 오버로딩

메서드 오버로딩 은 하나의 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도, 매개변수의 개수 또는 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의한다.

public void println(String  x){...}
public void println(Object  x) {...}

인스턴스 멤버

멤버는 필드와 메서드의 결합체이다.

  • 인스턴스 멤버는 객체 생성후에 사용 가능하다.
  • 인스턴스 멤버로 선언된 메서드는 클래스 멤버로 사용가능하다.

클래스 멤버

  • 클래스 멤버는 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버이다.
  • 클래스 멤버는 객체의 생성 필요없이 바로 사용 가능하다.
  • static 키워드를 이용하면 클래스 멤버로 선언된다.
  • 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없다.
//static
static String company = "GENESIS"; 

//class member 사용
Car car = new Car(); // 객체 생성
car.company = "Ferrari";

//인스턴스 필드(model) 사용 불가, 객체의 생성 필요
System.out.println("자동차 모델 확인: " + model); 

생성자

생성자는 객체가 생성될 때 호출되며 객체를 초기화하는 역할을 수행한다.

  • 기본생성자는 선언 되지 않아도 컴파일러가 기본 생성자를 바이트코드 파일에 자동으로 추가한다.
  • 생성자 오버로딩을 통해서 필드를 초기화 할 수 있다.
public Car(String modelName, String colorName) {
        model = modelName;
        color = colorName;
    }

this 와 this()

this 는 객체 즉, 인스턴스 자신을 표현하는 키워드이다.

  • 객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용된다.
  • 객체의 매서드에서 리턴타입이 인스턴스 자신의 클래스 타입이라면 this를 이용하여 자신의 주소를 반환한다.
  Car returnInstance() {
      return this;
  }

this() 는 객체 즉, 인스턴스자신의 생성자를 호출 하는 키워드이다.

  • this() 의 사용은 코드의 중복을 제거한다.
  public Car(String model) {
      this(model, "Blue", 50000000);
  }

접근 제어자

제어자는 객체의 무결성을 지키기위해, 클래스 또는 멤버에 사용하며 외부의 접근을 막는다.

  • 접근 제어자 : public, protected, default, private
  • 그 외 제어자 : static, final, abstract

public : 접근 제한이 전혀 없다.
protected : 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능하다.
default : 같은 패키지 내에서만 접근이 가능하다.
private : 같은 클래스 내에서만 접근이 가능하다.

  • 클래스 : public, default
  • 메서드 & 멤버변수 : public, protected, default, private
  • 지역변수 : 없음

Getter Setter

객체의 private 필드를 읽거나 저장하기 위해 Getter Setter 가 사용된다.
Getter Setter 의 사용방법은 인스턴스 메서드 호출과 동일하다.

private double speed; 
public String getModel() {
    return model;
}
public void setModel(String model) {
    this.model = model;
}
⚠️ 제어자 사용시 주의 사항
  • 메서드에 staticabstract를 함께 사용할 수 없다.
  • 클래스에 abstractfinal을 동시에 사용할 수 없다.
  • abstract메서드의 접근 제어자가 private일 수 없다.
  • 메서드에 privatefinal을 같이 사용할 필요는 없다.

정리

이번시간에는 객체와 클래스의 관계에 대해 알아보았다. 개념은 간단하지만 사용하는데 많은 주의점이 필요한 듯 하다. 다음시간에는 상속과 인터페이스에 대해 알아본다.

profile
이유를 찾아보자

0개의 댓글