클래스의 의미 (절차지향,객체지향, 객체화,생성자(인스턴스),this,오버로딩)

최동민·2022년 5월 21일
0

JAVA

목록 보기
2/13

절차지향과 객체지향

앞으로 우리는 개발을 해나갈 때 선택을 해야하는 순간이 온다.
내가 만들 프로그램이 절차지향과 객체지향 프로그램 둘 중 어느 프로그램을 선택하는 것이 맞는 것인지를.

- 절차지향 (C언어)

빵 반죽 -> 발효 -> 굽기 -> 장식 -> 판매
굽기 전에 판매할 수 없다.
반죽 전에 판매할 수 없다.
그 전 로직이 다 끝나기 전 다음 로직을 할 수 없다.
알고리즘에 특화되어 있다. 구성이 되어있지 않으면 다음 것을 할 수 없다.
즉 자료구조를 만드는 데에 목적이 있다.

- 객체지향 (Python)

만들어진 자료구조를 사용하는데에 목적이 있다.
빵집에서 치킨집으로 갈아타야겠다.
그 전 빵집에서 썼던 사람을 고용. 장식하던 사람을 고용.
그냥 불러들이기만 하면 됨.
추상적인 개념을 실체화시킨 것을 객체라 한다.
도형을 클래스, 세모 네모 동그라미를 객체라 한다.
클래스의 객체화. 객체지향언어


클래스(Class)

클래스가 한국말로 뭘까? (급, 반, 무언가가 모여있는 성격.)
클래스를 만들 때 첫 글자는 왜 대문자로 기입하게 만들어놓았을까?
Monkey eat banana.
클래스는 주어이다. 문장의 시작 (Monkey)
메소드는 동사 (eat)

자동차 (엄마차, 아빠차, 내 차)
자동차의 공통 요소는 무엇인가? (가격, 브랜드, 색깔)

Car라는 클래스를 만들고 그 안에 가격, 브랜드, 색깔을 한 번씩 선언한다. 그리고 엄마차, 아빠차, 내 차를 Car의 type으로 선언한다.

추상적인 자동차를 엄마차라는 객체로 만든다.
Car momCar = new Car();
실체화가 되었다. 생성자.
momCar라는 저장공간이 생긴다. (흰 공간. 새로운 주소값)
Car라는 클래스 안에 있는 것들을 momCar라는 공간으로 접근한다.
(price, brand, color)
클래스 안에 있는 이러한 녀석들을 field(필드) 라고 한다.
momCar.price 했을 때 엄마차의 주소값이 Car클래스에 넘어간다.
각각의 주소는 다르고 우린 그것을 구분할 수 있게 된다.

클래스
공통요소로 묶자!

클래스 선언

class 클래스명 {
필드(변수, 메소드)
}

클래스 사용

// 이제 우린 변수명이 아닌 객체명이라 하자.

클래스명 객체명 = new 클래스명();
객체명.필드;
'.' : 하위 연산자
A.b : A안에 b;
내가 객체명으로 .찍고 접근하게 되면 클래스 안에서는 그 주소를 this로 받는다.
this는 내가 사용한 객체의 주소를 받는 역할을 하는 것이다.

- 객체화(인스턴스)

추상적인 개념을 실체화시킨다.
클래스로 접근하지 않고, 클래스 타입의 객체를 만들어서 그 객체로 접근한다. 도형이 아닌 세모, 네모, 동그라미

객체화. Car클래스를 momCar로 실체화(객체화)하였다.
영어로는 인스턴스 변수라고도 한다.
(for instance : 예를 들어) 공포하는 것. "이렇게 할거야" 알리는 것.

- 생성자

클래스명()
초기화의 목적이 있다.
메소드와 같은 기능을 가지고 있지만, 리턴이 없으며, 리턴 타입도 없다. 따라서 메소드라고 부르지 않는다.

Car momCar = new Car();
이러한 애들을 '기본 생성자' 라 한다.
new는 흰 메모리에 무언가를 만든다는 의미의 연산자이고,
Car()는 생성자인 것이다.
생성자가 객체를 생성(실체화)해주고, 그 안에 있는 field(필드)들을 흰 메모리 영역에 만들어 줌. 객체 안에는 그 필드들의 시작 주소가 들어가 있다.

public Car() { 
}

내가 클래스를 선언한 순간부터 눈에는 보이지 않지만 기본적으로 내부에 만들어져 있는 생성자이다.

하지만 우리가 아래의 생성자를 만드는 순간부터는 이 친구가 기본 생성자가 된다.

public Car(int price, String color, String brand) {
	this.price = price;
	this.color = color;
	this.brand = brand;
}

위처럼 매개변수가 전혀 없던 기본생성자에서 내가 매개변수가 있는 생성자를 만들게 되면서 기본생성자가 내가 만든 걸로 바뀌었다.

  • 그 객체의 price = 내가 외부에서 받은 price로 초기화*

this

  • this.전역변수 = 지역변수
    처음에 price = price 이렇게 써보았다.
    그러자 컴파일러가 "지역변수야? 전역변수야? 이름이 같잖아!" 물어본다.
    this.price = price;
    객체 주소를 자동으로 받는 this. 그 객체의 price를 적어주는 것.
    즉 전역변수 price에다 내가 외부에서 받아온 값을 넣어줘야 한다.

this를 쓰고 안 쓰고 차이는. this는 지역변수의 이름과 전역변수의 이름이 같을 때 써주는 것이 원칙이며(구분하기 위해서), 그 외에는 본인 기호에 맞게 사용하면 된다. 난 this를 명시적으로 나타내고 싶다하면 사용하면 되고, 안쓰면 생략된 것 뿐.

만약 color와 brand만 초기화하고 싶다면? 클래스를 다시 만들어야할까? 그래서 우리는 오버로딩이란 것을 배운다.

오버로딩(Overloading)

같은 이름의 메소드라도 매개변수의 갯수 혹은 타입이 다르면 선언 가능하다.
따라서 main에서 매개변수가 없는 비어있는 생성자를 만들고 싶다면, 기존에 내부에 있다 사라졌던 기본 생성자를 직접 다시 만들어주면 된다.

public Car() { 
}


public Car(String color, String brand) {
	this.color = color;
	this.brand = brand;
}

따라서 우리는 이렇게 만들어 낼 수 있다.

public static void main(String[] args) {

	Car momCar = new Car(9000, "Black", "Benz");
	Car dadyCar = new Car("Red", "BMW");
	Car myCar = new Car();
	

	momCar.showInfo();
}	
profile
코드를 두드리면 문이 열린다

0개의 댓글