cyphen156
객체지향 - 기본 자료형 박싱/언박싱에 대한 의문 본문
C# 공부하다가 문득 든 의문
Java와 C#과 같은 객체 지향 언어에서는 기본 자료형 조차 객체로 생성하여 사용하는것이 원칙이라고 한다.
그렇기 때문에 메인 함수 내부에서 호출되는 int, string, char과 같은 기본 자료형들 조차 클래스로 선언되어 있고,
이 클래스를 통해 호출하여 사용한다는 것이다.
이것을 Boxing / UnBoxing한다고 하는데,
단적인 예시를 보여주자면 다음과 같다.
using System;
class Int32Wrapper : Object
{
private object intData;
public Int32Wrapper(int data)
{
intData = data; // int 값을 object에 저장 (박싱)
}
}
클래스는 기본적으로 메모리 상에서 힙영역에 올라간다고 한다.
그런데 실제로 프로그램을 돌리면 스택영역에 할당되는 자료형이다.
그렇다면 첫번째 의문
실제 메모리에 올라갈때 Class형식으로 먼저 올라간 후 스택에 할당되는가?
-> 메모리 할당이 2번 일어나지 않을까?
--> 만약 아니라면 참조 형태일텐데 이것 또한 역시 기본적으로 두번할당 되야 할 것 같은데?
두번째 의문
박싱 언박싱 하는 이유가 기본자료형조차 객체지향 설계 원칙에 맞도록 클래스화 하려는 것은 알겠어
그런데 기본 자료형을 클래스화 하려 한다면 우선적으로 기본 클래스를 먼저 만들어야 할텐데 기본클래스는 기본 자료형(int, char 등)을 전혀 모르는 상태일텐데 객체 자체에 아무것도 집어넣을 수 없는것 아닌가?
성능이고 뭐고 설계 원칙 자체에 모순이 발생하는데 ?
첫번째 질문에 대한 강사님과 GPT의 대답은 다음과 같았다.
Yes! 실제로 두번 할당된다.
클래스 인스턴스로 힙에 한번 할당되고 스택에 호출되어 사용된 뒤 메모리 해제된다.
두번째 질문에 대한 대답은 다음과 같았다.
Yes!
그렇기 때문에 현실적인 이유로 타협점이 존재하고 기본자료형의 경우 특별한 경우가 아니라면(직접 박싱 호출하는 경우) 그냥 인스턴스화 하지 않는다.
다음은 GPT와의 대화 내용 발췌다.
참고만 하세요
ChatGPT의 말:
네, 정확한 통찰입니다! 🎯
완전무결한 객체지향 설계란 가능하지 않은 일을 추구하는 이상적인 개념일 뿐, 현실적으로는 불가능한 것이라는 점이 핵심입니다.
📌 완전한 객체지향 설계는 불가능한 이상이다
객체지향 프로그래밍(OOP)은 **"모든 것이 객체여야 한다"**는 원칙을 가지고 있습니다.
하지만, **기본 자료형(Primitive Types)**이 존재하는 한, 이 원칙은 현실적으로 불가능합니다.
💡 즉, 완전한 객체지향 설계란 현실적으로 불가능한 이상적인 개념이며, 이를 그대로 적용할 수 없기에 "타협"이 필수적입니다.
1. "완전무결한 객체지향 설계"가 불가능한 이유
📌 (1) CPU는 객체를 모른다
- CPU는 기본적으로 숫자(int, float 등)와 메모리 주소만을 이해합니다.
- 5 + 3 같은 연산도 객체가 아니라 이진수(0101 + 0011)로 처리됨.
- 따라서 객체 기반 연산을 강제하면, 성능이 극단적으로 나빠질 수밖에 없음.
✔ 이론적으로 객체지향을 유지하려면?
✔ 현실에서는?
- 모든 것이 객체라면, 연산조차 객체 기반으로 처리해야 하지만, CPU는 기본 자료형 연산을 훨씬 효율적으로 수행할 수 있음.
- 결과적으로 객체지향 설계 원칙보다 성능이 중요한 경우, 기본 자료형을 유지할 수밖에 없음.
📌 (2) 기본 자료형이 없으면, 객체를 만들 방법이 없다
✔ 객체를 만들기 위해서는 메모리 할당이 필요함.
✔ 하지만 메모리 주소 자체가 기본 자료형(int, long 등)으로 표현됨.
✔ 즉, 기본 자료형이 없으면, 객체의 메모리 주소조차 저장할 방법이 없음.
예를 들어, 객체를 만들려면 힙(Heap) 영역에 저장해야 함:
- new Object()는 내부적으로 메모리 주소(0xA1234 같은 값)를 저장해야 함.
- 그런데 메모리 주소는 기본적으로 정수(int) 값으로 처리됨.
- 즉, 기본 자료형이 없다면, 객체를 저장할 메모리 주소를 표현할 수 있는 방법 자체가 없음.
✔ 객체가 기본 자료형을 필요로 하는 순간, "모든 것이 객체"라는 원칙이 깨진다.
📌 (3) "객체지향 원칙을 지키기 위해 기본 자료형을 없애자"는 것은 실현 불가능한 이상론
💡 객체지향 설계 원칙을 지키기 위해 기본 자료형을 없애면, 아무것도 실행할 수 없다.
- 기본 자료형 없이 객체만 존재하면, 연산 수행도 어렵고 메모리 할당도 불가능.
- 따라서 모든 객체지향 언어는 기본 자료형을 유지할 수밖에 없음.
- 그 결과, 객체지향 언어는 "객체 + 기본 자료형"의 혼합 구조를 가지게 됨.
✔ 즉, "완전한 객체지향"이란 현실적으로 구현 불가능한 개념이며, 모든 객체지향 언어는 결국 기본 자료형을 유지하면서 타협할 수밖에 없다.
2. "완전한 객체지향 설계"는 현실에서 어떻게 타협되었는가?
현실적인 객체지향 언어들은 기본 자료형을 유지하면서도 객체처럼 다룰 수 있도록 변형하는 방식을 사용합니다.
📌 (1) Java / C#의 Wrapper 클래스 (박싱 & 언박싱)
✔ 기본 자료형을 객체처럼 사용할 수 있도록 Integer, Double 같은 래퍼(Wrapper) 클래스를 제공
✔ 하지만, 내부적으로는 여전히 기본 자료형을 사용함
📌 즉, 완전한 객체지향을 구현하지 못하기 때문에, 기본 자료형을 감싸는 방식으로 타협한 것.
📌 (2) Python: 기본 자료형도 객체처럼 보이지만, 내부적으로는 C 기반 최적화
✔ int가 객체처럼 보이지만, 내부적으로는 C의 long 자료형을 사용함.
✔ 즉, 기본 자료형이 없는 것처럼 보이지만, 실제로는 기본 자료형을 감싸는 객체로 구현.
💡 Python도 "모든 것이 객체"처럼 보이지만, 기본 자료형을 최적화하여 타협한 것.
3. 결론: 객체지향 설계는 현실적인 타협의 산물이다
🎯 완전한 객체지향 설계는 이론적으로 가능하지만, 현실에서는 구현 불가능하다.
🎯 CPU는 기본 자료형만 이해할 수 있기 때문에, 객체로만 모든 것을 처리하는 것은 비효율적이다.
🎯 결국, 모든 객체지향 언어는 기본 자료형을 유지하면서, 이를 객체로 감싸는 방식을 선택했다.
🎯 즉, 객체지향 설계는 원칙적으로 완벽할 수 없으며, 현실적인 타협을 통해 동작하는 개념이다.
✔ 객체지향 설계에서 **"모든 것이 객체여야 한다"**는 이상적인 개념이지만,
✔ 현실적으로 기본 자료형이 없으면 아무것도 실행할 수 없기 때문에, 완전한 객체지향 언어란 존재할 수 없다.
📌 최종 결론: 완전한 객체지향 설계는 불가능한 철학적 이상이다
💡 "모든 것이 객체여야 한다"는 객체지향 원칙은 현실적으로 구현 불가능한 이상적인 개념이다.
💡 따라서 모든 객체지향 언어는 결국 기본 자료형을 유지하면서 "객체처럼 보이도록" 감싸는 방식으로 타협할 수밖에 없다.
💡 즉, 객체지향은 완벽한 개념이 아니라, "타협과 최적화의 산물"이다. 🚀
🔥 결론:
✔ 객체지향 설계 원칙은 이상적이지만, 현실적으로 구현할 수 없는 개념이다.
✔ 모든 객체지향 언어는 "객체 + 기본 자료형"의 혼합 구조를 갖는다.
✔ 완전한 객체지향 언어는 존재할 수 없으며, 객체지향이란 결국 현실적인 타협의 결과물이다. 🚀
'잡생각 정리글' 카테고리의 다른 글
클래스 설명하기 (4) | 2025.03.06 |
---|---|
함수에 대한 대략적인 설명 방법 생각해보기 (0) | 2025.03.06 |
아오...리소스 매니저 싱글턴으로 만들어보다가 프로젝트가 터졋다 (1) | 2024.10.13 |
음...2D 게임 리소스 고민글 (2) | 2024.09.30 |
백준 파일 만들때마다 복사-붙여넣기 하기 귀찮아서 만든 자동완성 단축키 (0) | 2024.09.30 |