프로그램 = 데이터 + 명령어 집합
명령어 실행을 위해서는 데이터 필요
CPU
- 연산 장치
- 저장 기능 없음
→ CPU가 알기 위해서는
반드시 메모리를 거쳐야 함
메인 메모리 = 주 기억 장치
- CPU가 직접 접근 가능
프로세스
- 메인 메모리에 올라와
- 실행 중인 프로그램
- 프로세스 구성 영역
- code - 실행할 명령어 영역
- data - 초기화된 데이터 저장
- stack - 시스템에서 관리-> 언제 선언/소멸되는지 명확)
- heap - 명령어 실행할 때 동적 할당 됨 -> 명령어 실행할 때 자율적 사용, 수거도 프로그램 책임)
- global - 전역 변수 저장
소프트웨어 공학
개발 ~ 폐기까지
전체 비용 산출 → 비용 절감 목적
1. 초기 :
- 개발 비용 절감을 위한
- 프로그래밍 방법론 중심
핵심 목표
- 코드 재사용성 증가
방법
- 모듈화
- 기능(코드의 집합체) 단위로 함수 분리
- 분리된 함수 재사용
문제 : 유지 보수 비용 절감에는 효율적이지 못함
=> 객체지향 등장
객체지향(object oriented programming)
- 목표
- 유지보수 비용 절감
- 변화에 둔감하게 설계
→ 변경 영향 최소화
- 기존 코드는 그대로 재사용
- 변화되는 부분만 수정
- 주로 비즈니스 로직
- 공통 기능 → 라이브러리 / 재사용 코드 => 객체 생성
- 변경 잦은 로직 → 분리해서 관리
객체 = 코드 + 데이터 => 복합체
ex) 객체의 역할 정의 = 하나의 객체는 하나의 역할만 수행하도록 정의
| 쇼핑몰 기능 = 회원 등록, 회원 탈퇴, 회원 정보 변경, 상품 등록, 상품 확인 ... |
=> 객체 역할 분리
- 응집도 높게
- 결합도 낮게
| 회원정보 관련 객체 = 회원 등록, 회원 탈퇴,, |
| 상품 정보 관련 객체 = 상품 등록, 상품 확인... |
스스로 하지 말고 전담자에게 회귀분석 시켜서 반환
각자의 역할 전담자 존재
Object
- 단일 역할
- 관련된 다수 기능 + 관련된 다수 데이터
- 독립적 실행 단위
- 코드 + 데이터의 묶음
구성
- 속성(attribute)
- 변수 형태
- 객체의 상태 정보
- 예) 의사 전문 지식
- 메소드(method)
- 서비스 제공 역할
- 함수 형태 (코드)
- 예) 상담(), 진료(), 수술()
예시
의사 객체
|
법률 객체
|
사용방법 : 객체.메소드()
- 예) 의사.진료()
캡슐화 = 정보 은닉
- 객체 내부 구현을 외부에 숨김
- 외부에서는 메소드(함수)를 통해서만 접근
멤버 변수 / 멤버 함수
- 같은 객체(영역) 내부에 존재
객체 내부 특징
- 멤버 함수 → 멤버 변수 직접 접근 가능
- 정보 접근 요청 불필요
- 정보 주고받기 위한 인터페이스 필요 ❌
객체 외부 특징
- 멤버 변수 직접 접근 ❌
- 멤버 함수를 통한 간접 접근만 허용
객체지향 설계하기 절차
- 객체 추출
- 객체 역할 정의 = 모델링 => UML로 정리
+ : public
- : private : 외부에서 접근 못함
속성이 메소드보다 생명주기가 길다
예시)
| 객체명 | 회원 |
| 속성 | -회원 아이디 -회원 등급 -회원 이름 -회원 등록 날짜 -전화번호 |
| 메소드 | +회원 정보 조회() +회원 정보 등록() +회원 정보 수정() +회원 정보 삭제() |
| 객체명 | 상품 |
| 속성 | -상품명 -상품 색상 -상품 가격 -상품 번호 -상품 등록 날짜 |
| 메소드 | +상품 등록() +상품 정보 조회() +상품 가격 조회() +상품 색상 조회() +상품 번호 조회() |
[슈팅게임 모델링]
좌표체계 :
- x 오른쪽이 +
- y 아래쪽이 + ( 수학계랑 반대!!!!)




객체에 display()라는 같은 이름의 메소드 있는데 괜찮은지 : ㄱㅊ !!
코드가 같더라도 데이터가 다름 ok
- 메세지 기반 접근
- 외부에서는
객체.display() 만 호출 - 내부에서
무엇을, 어떻게 출력하는지는 객체 책임
- 외부에서는
- 다형성
- 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()
- Player() 실행
- 메모리에 Player 객체 생성
- 자동으로 __init__() 호출
- x=10, y=20, myShape="Player" 세팅
- 생성된 객체의 주소를 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)
- 빈 리스트 sarr 생성
- 반복문 5회 실행
- 매 반복마다
- Enemy() 호출 -> 새로운 객체 생성
- __init__() 자동 실행 -> 랜덤 좌표 할당
- 생성된 객체 주소를 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 |