섹션 8 - 자바 객체 지향 프로그래밍 소개

Shy·2023년 2월 12일

Java정복

목록 보기
5/5

객체 지향 프로그래밍

C나 파스칼 같은 언어는 절차적/구조적(Procedural/Structured) 프로그래밍을 했다.

  • 절차를 중심으로 생각하고, 메서드나 함수가 있다.
  • 문제를 여러 절차의 함수로 해결한다.
  • 컴퓨터의 처리구조나 유사해 실행속도가 빠르다는 장점이 존재
  • 단점으론, 유지보수가 어렵고 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과가 출력되지 않을 수 있고, 디버깅이 어렵다.

객체지향 프로그래밍은

  • 문제와 관련된 다양한 객체들을 중점적으로 보고, 각자 가진 데이터는 무엇이며, 해당 데이터에 할 수 있는 것은 무엇이 있을까?
  • 데이터와 절차를 묶어서 하나의 덩어리로 본다.
  • 캡슐화: 데이터와 알고리즘(코드)를 하나로 묶어 정리된 것으로, 개발자가 만들며 관련된 코드와 데이터가 묶여있어 오류없이 사용이 편리, 데이터와 코드는 외부에서 알 수 없고, 캡슐화 되어있지 않은 데이터와 코드는 사용하기 어렵다.
  • 상속: 부모가 자식에게 유전자를 물려주듯이, 상위 클래스의 것들을 하위 클래스가 이어받는 것이다. 즉, 기존의 코드를 재활용 하는 것이다.
  • 다형성: 상속과 관련된 개념으로, 하나의 객체가 다른 여러 객체로 구성되는 것이다. 자바의 오버로드, 혹은 오버라이드 다형성이 이 다형성을 드러낸다.
  • 추상화: 실존하는 객체의 여러 특성 중, 프로그램을 만드는데 필요한 부분만 파악해서 추출하고 필요하지 않은 것들을 제거하는 것이다

객체지향언어의 장점은 다음과 같다.

  • 재사용성: '상속'이 가능하기 때문에 코드를 재사용 할 수 있어 편리
  • 생산성: 독립된 객체로 이루어져있기 때문에 생산적으로 작업 할 수 있고, 유지 및 보수가 용이 (디버깅이 쉽다.)
  • 코딩이 절차지향보다 간편함

객체지향언어의 단점

  • 처리속도가 절차지향보다 느림
  • 설계에 많은 시간소요가 들어감



객체 지향 프로그래밍 소개

Aeroplane (비행기)
	airline, make, type, position //data
    takeoff(), land(), cruise() //actions

AirHostess (승무원)
	name, address //data
    wish(), serve() //actions

Passenger (탑승객)
	name, address //data
    takeCab(), checkin(), walk(), smile() //actions

객체 지향적으로 생각한다는 것은, 현재 가진 문제에 연관된 여러 요소를 확인하는 것이다.
비행기, 승무원, 탑승객을 확인하고 연관된 것을 보고, 내가 사용하고자 하는 것이 무엇인지 확인하는 것이다.
비행기의 정보를 확인하고, 할 수 있는 행위를 확인하는 것이다.

  • State(상태): 객체가 내포한 데이터다.
  • Behaviour(동작): 객체가 행할 수 있는 행동


용어 - Class, Obj

Class Planet {
	name, location, distanceFromSun //data/state/fields
    revolve(), rotate() //actions/behavior/methods
}

Planet earth = new Planet();
Planet venus = new Planet();

Class: 클래스는 템플릿이다. 객체가 갖고 있는 데이터와, 객체에 행할 수 있는 동작이 무엇인지 규정 할 수 있다. 행성을 정의한다.

Object(Instance): 밑에 earth, venus와 같이 서로 속성은 다르지만, 클래스로부터 만들어진다. 템플릿의 인스턴스라고 한다.

Member Data/State/Fields: 모든 객체에 있는 데이터이다.

Actions/Methods/Behaviour: 특정 객체에 행할 수 있는 동작.


연습 문제 - Online Shopping System

Customer
	name, address
    login(), logout(), selectProduct(product)

Shopping Cart
	items
    add(item), remove(item)
    
Product
	name, price, quantityAvailable
    order(), changePrice()

MotorBike 자바 클래스와 몇가지 객체 만들기

Build a Motor Bike Class -adjust speed and gears.
We would want to create a few objects and play with them

  • Understand concepts of Class, Object, State, Behavior
  • Understand basics of Encapsulation and Abstraction

MotorBike.java가 Class를 만들고, 그 안에 행위인 start를 만들었다.
MotorBikeRunner는 Object인 ducati와 honda를 만들었다.

연습문제

Book 클래스 세가지를 만들어 본다.

Speed 변수를 활용한 객체 상태 소개

인스턴스의 상태는 아래와 같이 지정할 수 있고, 계속 변화시킬 수 있다.

Setter 메소드를 활용한 캡슐화의 기본 이해

캡슐화

  • 이 클래스만이 특정 클래스의 데이터에 접근해야 한다는 개념.
  • 다른 클래스는 이 데이터에 접근하려면, 해당 클래스의 동작, 즉 메서드를 통해 접근해야 한다.
  • 캡슐화는 특정 데이터에 접근해 값을 설정하는 데이터와 메서드이다.

위에서 MotorBike.speed로 접근한 예시는, 외부에서 데이터에 접근한 것이므로 캡슐화를 파괴했다. 해당 코드를 다음과 같이 수정한다.

변수를 비공개로 만들면, 클래스 외부에서 접근이 불가능하다.

외부에서 접근 했을 때, 컴파일 오류가 나는 것을 확인 할 수 있다.

MemberVariable : 메소드 밖에서 선언된 변수, 객체에 소속된 해당 개체 고유의 것.
LocalVariable : 메소드 안에서 선언된 변수

setSpeed라는 메서드를 통해서 접근했다.

Getter와 E를 활용한 Getter와 Setter 생성

캡슐화란?
한 개체를 다른 개체로부터 보호하는 것.
외부 개체가 직접 개체 내 데이터를 제어하지 못하도록 한다.
메서드를 거쳐야만 개체 내 데이터를 제어할 수 있다.

이번에 만들어 볼 것은, 메서드를 거쳐서 오토바이의 속력을 출력할 것이다.

이클립스 기능을 활용하여 Getter, Setter 생성하기

[source]-[GenerateGattersAndSetters] 를 통하여 이클립스에서 생성 가능하다.
Setter : 값을 지정해준다.
Getter : 값을 출력해준다.

캡슐화의 이점 - validation

차의 속도가 -100처럼 음수로 입력되는 것을 막아 줄 수 있다.


다만 위 코드의 방식으로 새롭게 Speed를 set하는 것은 문제가 존재한다.
코딩이 너무 길어진다는 것이다. 따라서 Speed의 증가, 감소에 관한 것도 캡술화 시킨다.

이렇게 검증 단계까지 제작해였으나, 위의 set과정과 decrease 과정에서 검증이 겹치므로 해당 문제를 해결해 본다.

이렇게 객체 내 로직을 캡슐화하면 외부 코드를 많이 수정할 필요 없이 쉽게 로직을 바꿀 수 있다.

추상화

  • 클래스들의 공통된 것들을 묶어서 상위의 클래스(슈퍼클래스)를 만드는 것이다.
  • 중복된 코드들을 줄일 수 있고, 코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지 보수시 시간 단축 등의 효과를 보여준다.
  • 대표적인 예로, 자동차와 오토바이의 상위 클래스를 만들고, 해당 클래스의 행동에 속도올리기와 속도내리기 등 공통적인 행동을 부여할 수 있다.

자바 생성자

  • 초기값을 설정하는 도구이다.
  • 생성자는 반환하는 타입이 필요 없다.
  • 생성자의 메서드 명칭은 클래스 명과 동일하다. (여기서는 MotorBike(parameter))
package com.in28minutes.oops;

public class MotorBike {
	
	//state
	private int speed; //member variable
	
    MotorBike() {
    	this.speed = 0; //파라미터가 없는 경우, 초기 속도가 0으로 지정된다.
    }
    
	MotorBike(int speed) { //생성자, 파라미터를 받는다.
		this.speed = speed; //입력한 파라미터를 초기 속도로 설정해준다.
	}
	
	void start() {
		System.out.println("Bike Started");
	}

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		if(speed > 0) {
			this.speed = speed;
		}
	}
	
	public void increaseSpeed(int howMuch) {
		setSpeed(this.speed + howMuch);
	}
	
	public void decreaseSpeed(int howMuch) {
		setSpeed(this.speed - howMuch);
	}
}

new로 새 개체를 만들 떄, 생성자가 호출되며, 생성자를 직접 만들지 않으면 자바 컴파일러가 디폴트 생성자를 제공한다. 생성자를 만들면, 아무것도 입력 안했을시에 작동할 인자 없는 생성자를 만들어 줘야 한다.

결론

  • 클래스
  • 객체이자 클래스의 인스턴스
  • 클래스에 데이터 추가하기
  • 클래스에 동작 추가하기
  • 캡슐화
  • 추상화

에 관해 배웠다.

profile
신입사원...

0개의 댓글