[SWAD] Ep.1 OOP(1)

GLICO·2024년 10월 24일

SWAD

목록 보기
1/12

Contents

  • 절차적 프로그래밍객체지향 프로그래밍의 차이 파악
  • 클래스객체를 구분하여 설명
  • 클래스 선언객체 생성 방법 파악
  • 인스턴스 변수, 클래스 변수, 메소드, 오퍼레이션 용어 파악

Introduction to OOP

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

프로그램을 여러 객체라는 기본 단위로 나누고 객체 사이의 상호 작용으로 동작하는 것으로 인식하고 기술하는 방식

OOP의 탄생 배경

초기의 프로그래밍 방식은 순차적/절차적 프로그래밍

  • 순차적 프로그래밍(Sequential programming)
    명시된 입력을 받아서 명시된 순서로 처리하고 순차적으로 결과를 내는 방식

  • 절차적 프로그래밍(Procedural programming)
    프로그램을 여러 작은 함수(Procedure)들의 단계적 호출로 구성하는 방식

절차적 프로그래밍(PP)방식의 문제점

PP에서 함수는 데이터의 처리 방식만 구조화 했을 뿐 데이터 자체는 구조화 하지 못했음

  • 데이터와 함수를 분리하여 생각하기 때문에 프로그램 관리가 어려움

프로그램의 규모가 커지면 함수들이 서로 얽혀 유지보수가 어려움

  • 데이터 변경(타입, 의미 등)이 되면 함께 수정해야 하는 함수가 많아짐
  • 함수나 호출의 순서가 바뀌면 결과값에 변경이 있을 수 있음

데이터와 함수를 하나의 덩어리로 묶어서 생각

  • 작은 문제들을 해결 할 수 있는 객체들을 만든 뒤,
    이 객체들을 조합해서 큰 문제를 해결하는 방식 (Bottom-up)
  • 한번 독립성/신뢰성이 높게 만들어 두면 그 이후엔 수정 없이 재사용할 수 있으므로 생산성 대폭 향상

절차적 vs 객체지향 프로그래밍

구조적인 차이

PP에서는 함수가 계층적인 구조를 이룸
OOP에서는 클래스의 모임으로 이루어지며 관계로 표현

PP의 반대는 OOP?

  • No! 방식의 차이이지 서로 반대의 개념이 아님을 유의

OOP가 PP보다 항상 우월?

  • No! 각각 상대적으로 장단점이 존재함 (용도에 맞는 것을 채택)
절차적 프로그래밍(PP)객체지향 프로그래밍(OOP)
접근 방식Top-downBottom-up
구현 방식전체 기능 동작 고려 -> 각 기능 구현객체 설계 -> 객체 상호 작용 설계
구성 요소함수객체
장점객체 관련 오버헤드를 줄여 빠르게 동작코드의 중복을 줄이고 재활용성이 높음, 구조 파악 및 디버깅이 쉬움
단점구조가 복잡해지고 코드 중복이 심해짐, 순서를 지켜야 해서 재활용성이 떨어짐설계에 많은 시간이 요구됨, 객체가 많아지면 오버헤드가 발생 할 수 있음
용도한정된 자원/특수 목적(보안, 속도)대규모 협업 프로젝트(생산성 중시)

Classes and objects

객체

객체(object)의 의미

  • 사전적 의미 : 실세계에 존재하거나 생각할 수 있는 대상
  • 프로그래밍 관점 : 어떠한 상태 값행위를 가지고 있는 데이터

절차지향적으로 객체를 구성한다면?

  • 상태 : 구조체로 표현
  • 행위 : 구조체로 표현된 상태를 입력으로 받는 함수로 표현
// 상태 (State)
struct Dog{
	string name = 뭉치;
    string color = 갈색;
    int weight = 20;
    string type = 불독;
    string feel = 배고픔;
};
// 행위 (Behavior)
void bark(Dog);
void eat(Dog);
void sleep(Dog);
void run(Dog);
void walk(Dog);
  • 데이터와 함수가 분리되어 있음

OOP에서 객체

데이터(상태값)와 행위를 하나로 묶어서 관리

  • 캡슐화(Encapsulation)
// Dog object(encapsulated)
name = 뭉치
color = 갈색
weight = 20kg
type = 불독
feel = 배고픔

void bark()
void eat()
void sleep()
void run()
void walk()

클래스

동일한 속성과 행위를 수행하는 객체의 집합

  • 같은 상태와 행위를 가지는 객체는 동일한 클래스에 속함
  • 객체 = 클래스의 인스턴스 (instance - 사례/실체)
  • 클래스는 데이터 타입(Type)으로 인식하기도 함

클래스를 객체를 생성하는 설계도(blueprint)로 해석

  • 비유 : 붕어빵 틀과 붕어빵의 관계
    붕어빵 틀 : 설계도, 클래스
    붕어빵 : 실체화 된 대상, 객체

클래스와 인스턴스의 구분

  • 인스턴스를 가질 수 있는 것은 클래스
  • 클래스에 의해 정의된 집합의 멤버가 될 수 있는 것은 인스턴스

클래스의 선언

class 키워드를 사용해서 선언

  • 멤버 변수 : 속성을 표현
  • 멤버 함수 : 행위를 표현
public class Dog {
	
    // 멤버 변수
	private String name;
    private int color;
    private String weight;
    private String type;
    private String feel;
    
    
    // 멤버 함수
    public void bark(){...};
    public void eat(){...};
    public void sleep(){...};
    public void run(){...};
    public void walk(){...};
    
    // 생성자
    public Dog(String name){
    	this.name = name;
    }

객체의 생성

new 키워드를 사용해서 생성

  • Class var_name = new Class(...);
  • 어떤 class의 인스턴스(instance)를 만들었다고 하기도 함
public class Main{
	public static void main(String[] args) {
    	Dog Molly = new Dog("Molly");
        
        Dog lucy = new Dog("lucy");
        
        Dog daisy = new Dog("daisy");
    }
}

Term disambiguation

인스턴스 변수 vs 클래스 변수

인스턴스 변수(Instance variable)

  • 각 인스턴스에 존재하는 데이터를 저장하기 위한 변수
  • 클래스 내에 선언되는 변수로 객체 생성 시마다 매번 새로운 변수 생성
  • 다른 객체와 공유하지 않음

클래스 변수 (Class variable)

  • 클래스에 속하는 객체들이 공유할 수 있도록 해주는 변수
  • Static으로 선언되고, 처음 딱 한 번만 생성됨
public calss StaticTest {
	
    // class var
	public static int classVar = 10;
    
    // instance var
    private int instanceVar;
    
    public void method(){
    	int localVar = 100;
        ...
    }
}

메모리 생성 위치

  • staticTest1과 staticTest2 두 객체를 생성했을 때

Static Area
classVar= 10

Stack Area
staticTest1{
localVar = 100
}

staticTest2{
localVar = 100
}

Heap Area
staticTest(instance){
instanceVar
}

staticTest(instance){
instanceVar
}

변수 vs 객체

변수와 객체는 다름!

  • 변수는 객체를 가리키는 nametag임 (reference라고 하기도 함)
  • 변수는 특정 시점에 따라 객체를 가리킬 수도 아닐 수도 있음
  • 한 객체는 동시에 여러 변수에 의해 가리켜질 수도 있음

오퍼레이션 vs 메소드

오퍼레이션(Operation)

  • 수행되어야 할 연산(행위)을 추상화 한 것 -What
  • 행위가 어떻게 구성 되는지 선언만 하고 내부 구현은 신경쓰지 않음

메소드(Method)

  • 특정 클래스에서 operation의 구현체 -How
  • 다른 클래스 안에 같은 이름을 가진 메소드가 잇을 수 있음
  • 각 클래스에 맞는 방식으로 해당 operation이 다르게 구현 될 수 있음(Polymorphism)
profile
Its me Glico

0개의 댓글