프로그래밍에서의 객체
가장 흔히 쓰이는 의미로, 데이터(속성)와 그 데이터를 처리하는 기능(동작)을 하나로 묶어놓은 실체입니다. 위키독스 +1
- 구성 요소:
- 속성(Property/Attribute): 객체가 가진 정보 (예: 자동차의 색상, 모델명).
- 메서드(Method): 객체가 할 수 있는 행동 (예: 자동차의 주행하기, 멈추기).
- 클래스와의 관계: 클래스가 ‘설계도(붕어빵 틀)’라면, 객체는 그 설계도를 바탕으로 실제로 메모리에 만들어진 ‘결과물(붕어빵)’입니다. 이를 구체적으로 부를 때 인스턴스(Instance)라고도 합니다.
- 특징: 각 객체는 서로 독립적이며, 식별 가능한 고유의 이름을 가집니다.
개념 예시
1. 붕어빵 예시 (클래스 vs 객체)
- 붕어빵 틀 (클래스): 붕어빵을 만들기 위한 ‘설계도’입니다. 모양은 정해져 있지만, 그 자체를 먹을 순 없죠.
- 붕어빵 (객체): 틀에서 찍어낸 실제 결과물입니다.
- 객체 A: 속성(팥소), 상태(따끈함)
- 객체 B: 속성(슈크림), 상태(식었음)
- 모양은 같지만, 안에 든 재료나 상태가 다른 각각의 독립된 객체가 됩니다.
2. 자동차 예시 (속성 vs 기능)
프로그래밍에서 객체는 ‘정보’와 ‘능력’을 동시에 가집니다.
- 객체 이름: 내 차 (MyCar)
- 속성 (데이터):
- 모델명: 아반떼
- 색상: 흰색
- 현재 속도: 60km/h
- 메서드 (동작/기능):
가속하기(): 속도를 높이는 동작브레이크(): 차를 멈추는 동작
1. 딕셔너리와 객체의 관계
- 객체(Object): ‘사물’이라는 아주 넓은 개념입니다. (자동차, 강아지, 데이터 묶음 등)
- 딕셔너리(Dictionary): 그 사물 중에서도 ‘이름표(Key)와 내용물(Value)로 이루어진 명부’ 같은 특정 형태의 자료구조를 말합니다.
2. 왜 헷갈릴까요? (JavaScript의 영향)
자바스크립트(JS)라는 언어 때문일 가능성이 큽니다.
- JS에서는 객체를 만들 때
{ name: "철수", age: 20 }같은 형식을 쓰는데, 이게 파이썬의 딕셔너리와 모양이 똑같습니다. - 그래서 많은 입문자가 “객체 = {키:값} 묶음 = 딕셔너리”라고 생각하게 됩니다.
3. 차이점 (핵심)
- 딕셔너리: 단순히 데이터를 담아두는 바구니 역할에 집중합니다. (값들의 모임)
- 객체: 데이터뿐만 아니라 기능(함수/메서드)까지 포함할 수 있는 더 큰 개념입니다.
- 예: 딕셔너리는 “이름” 정보만 갖지만, 객체는 “이름” 정보에 더해 “인사하기”라는 행동까지 가질 수 있습니다.
결론:
자료형 관점에서 딕셔너리는 데이터를 구조화해서 들고 있는 ‘데이터 객체’의 일종입니다.
1. 자바스크립트 객체 (Object) = 딕셔너리?
자바스크립트에서 객체를 만드는 가장 흔한 방법은 { } (중괄호)를 쓰는 것입니다.
javascript
let user = {
name: "철수", // 키: 값
age: 25 // 키: 값
};
코드를 사용할 때는 주의가 필요합니다.
이 구조는 파이썬 같은 언어의 딕셔너리와 완전히 똑같습니다. 그래서 자바스크립트에서 객체는 데이터를 저장하는 ‘사전(Dictionary)’처럼 쓰입니다.
2. 하지만 딕셔너리보다 더 강력합니다
자바스크립트 객체는 단순한 데이터 묶음을 넘어 행동(함수)도 가질 수 있습니다.
javascript
let user = {
name: "철수",
sayHello: function() { // 객체 안에 함수(메서드)가 들어감
console.log("안녕하세요!");
}
};
user.sayHello(); // "안녕하세요!" 출력 (행동 수행)
코드를 사용할 때는 주의가 필요합니다.
일반적인 딕셔너리가 ‘명부’라면, 자바스크립트 객체는 ‘데이터와 기능을 모두 갖춘 로봇’에 가깝습니다.
3. 진짜 딕셔너리 전용인 Map도 있어요
최신 자바스크립트(ES6+)에는 딕셔너리 기능을 더 전문적으로 수행하는 Map이라는 자료형이 따로 추가되었습니다.
- 일반 객체
{ }: 데이터 + 기능(함수)을 합칠 때 주로 사용 - Map: 순수하게 ‘키-값’ 쌍으로 데이터를 관리할 때(딕셔너리 용도) 사용
결론:
자바스크립트에서 객체는 딕셔너리처럼 동작하지만, 그 안에 함수(메서드)까지 넣어서 사용할 수 있는 더 확장된 개념이라고 보시면 됩니다.
1. 점 표기법 (Dot Notation)
가장 많이 쓰이고 읽기 편한 방식입니다.
- 사용법:
객체명.키이름 - 특징: 키 이름을 정확히 알고 있을 때 사용합니다.
javascript
let user = {
name: "철수",
age: 25
};
console.log(user.name); // "철수"
console.log(user.age); // 25
코드를 사용할 때는 주의가 필요합니다.
2. 대괄호 표기법 (Bracket Notation)
조금 더 강력하고 유연한 방식입니다.
- 사용법:
객체명["키이름"](키 이름을 문자열로 감싸야 함) - 언제 쓰나요?
- 키 이름에 공백이나 특수문자가 있을 때 (예:
"home address") - 키 이름을 변수에 담아서 동적으로 가져올 때 (매우 중요!)
- 키 이름에 공백이나 특수문자가 있을 때 (예:
javascript
let user = {
name: "철수",
"home address": "서울"
};
// 1. 공백이 있는 키
// console.log(user.home address); // 에러 발생!
console.log(user["home address"]); // "서울" (정상)
// 2. 변수를 사용해 접근할 때
let keyName = "name";
console.log(user[keyName]); // "철수" (user["name"]과 같음)
console.log(user.keyName); // undefined (객체에서 'keyName'이라는 글자 그대로의 키를 찾음)
코드를 사용할 때는 주의가 필요합니다.
요약하자면!
- 보통은 점 표기법(
user.name)을 쓰세요. 코드가 깔끔합니다. - 하지만 키 이름이 변수에 들어있거나, 이름이 특이(공백 등)할 때는 대괄호 표기법(
user[key])을 써야만 합니다.
파이썬에서 객체와 자바스크립트에서 객체가 어떻게 다른지 비교해줘
두 언어 모두 ‘객체 지향’을 지원하지만, 객체를 바라보는 관점과 구현 방식에서 큰 차이가 있습니다. 핵심적인 차이점 3가지를 정리해 드릴게요.
1. 설계도(Class)가 필수인가?
가장 큰 차이는 “설계도 없이 객체를 만들 수 있는가”입니다.
- 파이썬 (Class 기반): 객체를 만들려면 반드시 클래스(설계도)를 먼저 정의해야 합니다. 클래스라는 틀에서 찍어낸 결과물(인스턴스)이 바로 객체입니다.
- 자바스크립트 (Prototype 기반): 클래스 없이도
{ }(중괄호)만 쓰면 즉석에서 객체를 만들 수 있습니다. 이를 객체 리터럴이라고 부르며, 딕셔너리처럼 자유롭게 생성하고 확장할 수 있습니다.
2. 딕셔너리와 객체의 관계
질문하셨던 ‘딕셔너리’ 개념과 연결되는 부분입니다.
- 파이썬:객체와 딕셔너리는 서로 다른 자료형입니다.
obj.name(객체 속성 접근)과dict['name'](딕셔너리 키 접근)은 문법적으로 엄격히 구분됩니다.
- 자바스크립트:객체 자체가 사실상 딕셔너리(해시 맵) 구조입니다.
obj.name과obj['name']이 같은 대상을 가리키며, 실행 중에 속성을 마음대로 추가하거나 삭제하는 것이 파이썬보다 훨씬 자유롭습니다.
3. 기능(메서드)을 다루는 방식
- 파이썬: 객체의 메서드는 클래스 내부에 고정되어 정의됩니다. 메서드 호출 시 첫 번째 인자로 항상
self를 명시해야 하는 특징이 있습니다. - 자바스크립트: 함수도 하나의 ‘값’이기 때문에, 객체의 속성에 함수를 변수처럼 할당하면 그것이 바로 메서드가 됩니다. 실행 시점에 따라
this가 가리키는 대상이 변할 수 있어 더 유연하지만 복잡하기도 합니다.
요약 비교표
| 구분 | 파이썬 (Python) | 자바스크립트 (JS) |
|---|---|---|
| 기본 철학 | 모든 것은 객체다 (Class 기반) | 모든 것은 객체다 (Prototype 기반) |
| 생성 방식 | class 정의 후 호출 | { }로 즉석 생성 가능 (리터럴) |
| 딕셔너리와의 관계 | 별개의 자료형으로 구분됨 | 객체가 곧 딕셔너리 역할을 겸함 |
| 유연성 | 엄격함 (구조가 정해져 있음) | 매우 유연함 (동적 속성 추가 빈번) |
리터럴(Literal)은 문자 데이터뿐만 아니라, 코드 작성자가 직접 입력한 ‘값’ 그 자체를 의미합니다.
쉽게 말해, 변수에 담기 전의 “가공되지 않은 순수한 값”을 리터럴이라고 부릅니다.
1. 리터럴의 종류 (데이터 타입에 따라)
질문하신 ‘문자 데이터’는 문자열 리터럴에 해당하며, 그 외에도 다양한 종류가 있습니다.
- 문자열 리터럴:
"Hello",'JS'(따옴표로 감싼 글자들) - 숫자 리터럴:
10,3.14(정수나 실수 값 그 자체) - 불리언 리터럴:
true,false - 객체 리터럴:
{ name: "철수" }(중괄호를 써서 즉석에서 만든 객체) - 배열 리터럴:
[1, 2, 3](대괄호를 써서 즉석에서 만든 리스트)
2. 변수 vs 리터럴 (차이점)
- 변수: 값을 저장하는 ‘이름표(그릇)’입니다.
- 리터럴: 그 그릇에 담기는 ‘내용물(진짜 값)’입니다.