LG DX DATA SCHOOL

12/22 객체 지향

getfeelingsfrom 2025. 12. 22. 17:49

프로그램 = 데이터 + 명령어 집합

명령어 실행을 위해서는 데이터 필요

 

CPU

  • 연산 장치
  • 저장 기능 없음

→ CPU가 알기 위해서는
반드시 메모리를 거쳐야 함

메인 메모리 = 주 기억 장치

  • CPU가 직접 접근 가능

프로세스

  • 메인 메모리에 올라와
  • 실행 중인 프로그램
  • 프로세스 구성 영역
    • code - 실행할 명령어 영역
    • data - 초기화된 데이터 저장 
      • stack - 시스템에서 관리-> 언제 선언/소멸되는지 명확)
      • heap - 명령어 실행할 때 동적 할당 됨 -> 명령어 실행할 때 자율적 사용, 수거도 프로그램 책임)
      • global - 전역 변수 저장 

소프트웨어 공학

개발 ~ 폐기까지
전체 비용 산출 → 비용 절감 목적

1. 초기 : 

  • 개발 비용 절감을 위한
  • 프로그래밍 방법론 중심

핵심 목표

  • 코드 재사용성 증가

방법

  • 모듈화
  • 기능(코드의 집합체) 단위로 함수 분리
  • 분리된 함수 재사용

문제 : 유지 보수 비용 절감에는 효율적이지 못함 

 

=> 객체지향 등장

 


 

객체지향(object oriented programming) 

  • 목표
    • 유지보수 비용 절감
    • 변화에 둔감하게 설계
      → 변경 영향 최소화
    개념
    • 기존 코드는 그대로 재사용
    • 변화되는 부분만 수정
    변화 대상
    • 주로 비즈니스 로직
    구조
    • 공통 기능 → 라이브러리 / 재사용 코드 => 객체 생성
    • 변경 잦은 로직 → 분리해서 관리

       객체 = 코드 + 데이터 => 복합체

ex) 객체의 역할 정의 = 하나의 객체는 하나의 역할만 수행하도록 정의 

쇼핑몰 기능 = 회원 등록, 회원 탈퇴, 회원 정보 변경, 상품 등록, 상품 확인 ...

=> 객체 역할 분리 

  • 응집도 높게 
  • 결합도 낮게 
회원정보 관련 객체 = 회원 등록, 회원 탈퇴,, 
상품 정보 관련 객체 = 상품 등록, 상품 확인...

 

스스로 하지 말고 전담자에게 회귀분석 시켜서 반환 

각자의 역할 전담자 존재

 


 

Object

  • 단일 역할
  • 관련된 다수 기능 + 관련된 다수 데이터
  • 독립적 실행 단위
  • 코드 + 데이터의 묶음

구성

  • 속성(attribute)
    • 변수 형태
    • 객체의 상태 정보
    • 예) 의사 전문 지식
  • 메소드(method)
    • 서비스 제공 역할
    • 함수 형태 (코드)
    • 예) 상담(), 진료(), 수술()

예시

의사 객체
  • 속성: 의사 전문 지식
  • 메소드: 상담(), 진료(), 수술()
법률 객체
  • 속성: 법률 전문 지식
  • 메소드: 법률상담(), 서류작성(), 변호()

 

사용방법객체.메소드()

  • 예) 의사.진료()

캡슐화 = 정보 은닉

  • 객체 내부 구현을 외부에 숨김
  • 외부에서는 메소드(함수)를 통해서만 접근

멤버 변수 / 멤버 함수

  • 같은 객체(영역) 내부에 존재

객체 내부 특징

  • 멤버 함수 → 멤버 변수 직접 접근 가능
  • 정보 접근 요청 불필요
  • 정보 주고받기 위한 인터페이스 필요 ❌

객체 외부 특징

  • 멤버 변수 직접 접근 ❌
  • 멤버 함수를 통한 간접 접근만 허용

 


 

객체지향 설계하기 절차

  1.  객체 추출 
  2.  객체 역할 정의 = 모델링 => UML로 정리 
    + : public
    - :  private : 외부에서 접근 못함 
    속성이 메소드보다 생명주기가 길다 
    예시)
객체명 회원
속성 -회원 아이디
-회원 등급
-회원 이름
-회원 등록 날짜
-전화번호
메소드 +회원 정보 조회()
+회원 정보 등록()
+회원 정보 수정()
+회원 정보 삭제()

 

객체명 상품
속성 -상품명
-상품 색상
-상품 가격
-상품 번호
-상품 등록 날짜
메소드 +상품 등록()
+상품 정보 조회()
+상품 가격 조회()
+상품 색상 조회()
+상품 번호 조회()

 

[슈팅게임 모델링] 

좌표체계 :

  • x 오른쪽이 +
  • y 아래쪽이 + ( 수학계랑 반대!!!!)

내가 만든 것
교수님 정답


객체에 display()라는 같은 이름의 메소드 있는데 괜찮은지  : ㄱㅊ !! 

코드가 같더라도 데이터가 다름 ok

 

  1. 메세지 기반 접근
    • 외부에서는
      객체.display() 만 호출
    • 내부에서
      무엇을, 어떻게 출력하는지는 객체 책임
    → 접근 방식이 일관적
  2. 다형성
    • Player.display()
    • Enemy.display()
    같은 메시지지만
    객체에 따라 다르게 동작 → 객체지향 핵심 개념

 

주 기억 장치(메인 메모리)에 올라와 있으면
실체


클래스 — 실체화 (메모리 할당) → 인스턴스(객체)

클래스

  • 설계도
  • 메모리에 없음 (개념적 존재)

인스턴스(객체)

  • 메인 메모리에 생성됨
  • 실제로 동작하는 대상

 


class Player:    # 클래스 정의
    
    def __init__(self): # 초기화 함수
        self.x = 10
        self.y = 20
        self.myShape = "Player"

    # 메소드 
    def display(self):
        print(self.x, ",", self.y, ":", self)

    def moveLeft(self):
        pass

    def moveRight(self):
        pass

1️⃣ Class Player

클래스란 ? 

Player는 설계도에 해당 

실제 플레이어가 아니라 플레이어 객체를 만들기 위한 틀이다

  • 클래스 -> 설계도 
  • 객체(인스턴스) -> 설계도를 바탕으로 만든 실제 물건

 

2️⃣ __init__(self) – 초기화 함수의 역할

  • 객체가 생성될 때 자동으로 실행되는 함수
  • 생성자 라고도 부른다
  • self 의 의미 
    • self.x= 10
    • 이 객체의 x값은 10이다라는 뜻
    • 객체마다 자기만의 x, y, myShape를 가지게 된다

3️⃣ 인스턴스 변수란?

self.x
self.y
self.myShape
  • 이 변수들은 객체마다 따로 존재
pobj = Player()
pobj2 = Player()
  • pobj.x와 pobj2.x는 서로 다른 메모리 공간
  • 값은 같아도 완전히 독립적인 객체

4️⃣ display() 메소드 분석

def display(self):
    print(self.x, ",", self.y, ":", self)
  • self.x -> 해당 객체의 x좌표
  • self.y -> 해당 객체의 y좌표
  • self -> 객체의 주소값 
  • self를 출력하면 ? <__main__.Player object at 0x000001A2...> 같은 형태가 나오는데 이는 객체가 저장된 메모리 주소를 의미
  • pobj와 pobj2는 값이 같아도 주소는 다르다 

 

5️⃣  main 영역 – 객체 생성과 메소드 호출

pobj = Player()
pobj2 = Player()
  1. Player() 실행
  2. 메모리에 Player 객체 생성
  3. 자동으로 __init__() 호출
  4. x=10, y=20, myShape="Player" 세팅
  5. 생성된 객체의 주소를 pobj에 저장 

6️⃣ 메소드 호출 결과

pobj.display()
pobj2.display()

 

출력 결과 

10 , 20 : <__main__.Player object at 0x1a2b3c>
10 , 20 : <__main__.Player object at 0x4d5e6f>
  • 값은 같지만
  • 주소값이 다르다 -> 서로 다른 인스턴스
 

import random 
class Enemy: 
    def __init__ (self): 
        self.x=random.randint(0,800)
        self.y=random.randint(0,600)
        self.myshape="Enemy"

    def display(self):
        print(self.x,",",self.y,"=",self.myshape)

    def moveLeft(self, dist):
        self.x-=dist
        self.display() #변경내용 확인해주기위해서 

    def moveRight(self, dist):
        self.x+=dist
        self.display()    
        
    def moveUp(self, dist):
        self.y-=dist
        self.display()    
    def moveDown(self, dist):
        self.y+=dist
        self.display()    
        
        
#main
sarr=[]
for i in range(0,5):
    obj=Enemy()
    sarr.append(obj)

print(sarr)

 

1️⃣ import random의 역할

import random
  • 난수(랜덤 값)를 생성하기 위한 표준 라이브러리
  • random.randint(a,b) -> a이상 b이하의 정수 변환 

2️⃣ Enemy 클래스의 초기화 (__init__)

def __init__ (self): 
    self.x = random.randint(0,800)
    self.y = random.randint(0,600)
    self.myshape = "Enemy"​
  • Enemy 객체 하나가 생성될 때마다 
    • x 좌표 : 0~ 800 사이 임의의 값
    • y좌표 : 0~ 600 사이 임의의 값
  • 모든 enemy는 서로 다른 시작 위치를 가질 가능성이 높다 

3️⃣ display() 메소드

 
def display(self):
    print(self.x,",",self.y,"=",self.myshape)
  • 현재 enemy 객체의 좌표와 타입을 출력
  • 이동 후 좌표 변경 확인용으로 매우 적절한 메소드 

 

4️⃣ 이동 메소드 구조 (공통 패턴)

def moveLeft(self, dist):
    self.x -= dist
    self.display()
  • dist-> 이동 거리(외부에서 전달)
  • 좌표 변경 후 display() 호출 => 변경 결과를 즉시 확인하기 위함 

 

5️⃣ main 영역 – Enemy 객체 여러 개 생성

sarr = []
for i in range(0,5):
    obj = Enemy()
    sarr.append(obj)
  1. 빈 리스트 sarr 생성
  2. 반복문 5회 실행
  3. 매 반복마다
    1. Enemy() 호출 -> 새로운 객체 생성
    2. __init__() 자동 실행 -> 랜덤 좌표 할당
    3. 생성된 객체 주소를 obj에 저장

=> 결과적으로 sarr에는 Enemy 객체 5개 들어있다 

'LG DX DATA SCHOOL' 카테고리의 다른 글

12/30 기술 통계학 + R  (0) 2025.12.30
12/29 통계 기반 데이터 분석 (넘파이/ 판다스)  (0) 2025.12.29
12/24 상속, 정규 표현식  (1) 2025.12.24
12/23 객체 지향 복습 / 판다스 (Pandas)  (0) 2025.12.23
12/19  (0) 2025.12.19