PL 객체와 클래스(7)
객체지향 프로그래밍 언어의 역사와 핵심 개념을 설명합니다. Simula-67부터 Java, Python까지 주요 객체지향 언어의 발전 과정, 캡슐화 원리, 정적/실체 변수와 메소드의 차이, 그리고 Java, Python, C++에서의 클래스 구현 방식과 제네릭/템플릿 프로그래밍 특징을 비교하여 다루고 있습니다.
객체지향 언어 역사
Simula-67, Smalltalk, C++, Java
- C++, JAVA도 Simula-67의 영향을 많이 받음
- C++에서 가상함수란 동적 바인딩. 즉 실행시간에 바인딩.(자바도 마찬가지)
- 즉, C++의 virtual 함수와 자바의 일반 함수는 동적 바인딩으로 할당한다.
- 참고로 GUI란 그래픽 유저 인터페이스
Objective-C/Swift, C#, Python
- Python도 인터프리터 언어기 때문에
플랫폼 독립적
이며동적 타이핑
을 지원
(C)프로그램
은 데이터
(변수, 구조체/배열 등) + 명령어
(배정문, 조건문/반복문, 함수)로 구성
객체지향프로그램
은 데이터(구조체)+명령어(함수)가 객체
(클래스)고, 객체들과의 상호작용
으로 구성
-
객체(instance)
– 속성(데이터), 행동(연산) -
클래스
- 객체의 정의 or 타입 -
프로그램
- 클래스들의 집합 -
프로그램 실행
- 서로 상호작용하는 객체들의 집합
캡슐화
추상 자료형 - 캡슐화하여 정의한 자료형
- 외부에서 접근X
- 내부에서 메소드로
필드변수
접근O
클래스 - 캡슐화 + 더 많은 기능 제공
- 참고로 파이썬의 self는 Java의 this이다.
- 예로
self.name
으로 바로 사용가능
접근 지정자
-
Java – public, private, package, protected
-
Python – 밑줄x(public), __로 시작(private), _로 시작(protected)
정적 변수 및 정적 메소드 - static
변수?
-
실체 변수(=객체 변수) – 각 객체마다 기억공간이 할당됨(
인스턴스 내
에 변수)-
자바 - 선언해서 바로 사용
-
파이썬 - 선언하지 않고 바로 사용(타입 지정을 안하다보니)
-
-
정적 변수(=클래스 변수)
-
자바 - static으로 선언된 변수(
클래스 내
에 기억공간 생성) -
파이썬 - 그냥 바로 초기화가 됨. 대신 사용은 자바처럼
클래스명.변수명
으로 동일
-
-
전역 변수(=객체변수 + 클래스변수) -
어디서든 호출 가능
. 즉, 클래스 내에서 or 객체들 내에서 사용가능한 변수-
자바 - 전역에서 사용 가능
-
파이썬 - 전역에서 사용 가능(다만, global 선언이 필요할 때가 있음)
-
global 선언은 다른 클래스에서도 전역으로 사용하게 해줌. 근데 그냥 해도 사용됨.
-
다만 함수에선 지역변수로 자동 생성(실체변수)되므로 global 선언 꼭 해줘야 전역 변수를 바인딩함.
-
-
메소드?
-
실체 메소드(=객체 메소드) -
객체 생성 후
사용가능, 해당 인스턴스내 메소드 -
정적 메소드(=클래스 메소드) – static으로 선언된 메소드(
객체 생성 X
=> 따라서 실체 변수 사용 못함)
클래스
1-1. Java 클래스
중요) 클래스에서 타입 캐스팅은 부모-자식 관계여야 가능
class 클래스 이름 {…} 내부에 3가지를 “클래스 멤버”라 칭한다.
- 3가지 : 필드 변수 선언, 생성자 선언, 메소드 선언
객체 참조 변수 선언 – 객체 생성(동적할당)된 것 아님(그러나 C++은 생성. 정적 바인딩)
객체 생성 – new 연산자로 객체 생성된 것(동적 바인딩)
-
스택에 acc1(즉, 변수명), 힙에 객체(instance)할당 => acc1이 힙에 객체를 가리킴
-
스택에 acc1이 제거되면?
- 힙에 객체는 자바의 경우 GC가 제거해주고, C언어는 free()로 직접 반환
- 자바는 C처럼 메모리에 직접 접근 불가하기 때문
1-2. 제네릭
제네릭 프로그래밍 – 매개변수 다형성
-
제네릭 클래스 –
타입 매개변수(type parameter)
를 받는 클래스-
ArrayList<Integer>...
-
public class Box<T> { }
-
-
제네릭 메소드 –
타입 매개변수(type parameter)
를 받는 메소드-
public static <T> Box<T> boxing(T t) {...}
(참고로Box<T>
는 실제 클래스 타입이다!
-
-
호출 방법 - 클래스는 뒤에, 메소드는 앞에
<>
-
Box<String> box1 = TestBox.<String>boxing(“test”);
참고로 TestBox클래스의 메소드인 boxing() 을 호출 한 것
-
2-1. python 클래스
class 클래스명:
으로 클래스를 선언한다.
-
생성자 :
def __init__(self, 매개변수):
-
소멸자 :
def __del__(self, 매개변수):
3-1. C++ 객체 및 클래스
특징은 this->name
이다.
-
this가 자바나 파이썬도 주소지만(당연히 모든 변수는 주소) 객체를 저장한 메모리 주소이고,
-
C는 그 객체 저장한 메모리 주소를 저장한 메모리를 가리키는 주소라 차이가 있는 것이다(
객체 변수 접근은 this->balance 와 balance
둘다 가능
객체 생성 방식 2가지(자바랑 구분, 자바는 애초에 new로 생성해도 .
으로 접근함)
-
클래스 타입으로 변수를 선언(정적) - 스택
-
int a=0;
- 스택 -
a;
- 주소가 아닌 값 - 클래스 타입으로 선언한 acc1도 주소가 아닌 값으로 접근
- 따라서
acc1.메소드
로 사용가능
-
-
new 연산자를 이용한 동적 객체 생성 - 힙
-
(*p).메소드명
또는 -
p->메소드명
으로 접근이 가능 - new를 통해 주소를 저장해서 동적으로 객체 생성하기 때문
-
3-2. 템플릿 – 제네릭 프로그래밍
템플릿 – 매개변수 다형성
템플릿 클래스 – template <typename 변수이름>
을 class 선언전에 추가, type자리엔 전부 T
템플릿 함수 - template <typename 변수이름>
을 함수 선언전에 추가, type자리엔 전부 T
자바와 차이점
- 정의 표기법이 좀 다르고,
- 실행 때 자바와 다르게 클래스, 함수 둘다
예로 <int>
가 뒤에 들어감-
sum<int>(1,2);
와Box<string> b(“hello”);
-
댓글남기기