멤버 변수
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
멤버 변수는 객체 지향 프로그래밍에서 클래스 내에 선언되어 객체의 상태를 나타내는 변수를 의미한다. 멤버 변수는 지역 변수와 구분되며, C++, Java, Python, Common Lisp, Ruby, PHP, Lua 등 다양한 프로그래밍 언어에서 멤버 변수를 정의하고 사용한다. 각 언어별로 멤버 변수의 선언 및 접근 방식, 접근 제한자, 그리고 멤버 변수의 종류에 차이가 있다.
더 읽어볼만한 페이지
- 변수 (컴퓨터 과학) - 정적 변수
정적 변수는 프로그램 실행 시간 동안 값을 유지하며, C 언어에서 `static` 키워드로 정의되어 함수 호출 간에 값을 유지하고, 객체 지향 프로그래밍에서 클래스의 모든 인스턴스에서 공유되는 클래스 변수로 사용된다. - 변수 (컴퓨터 과학) - 전역 변수
전역 변수는 프로그램 내 모든 함수에서 접근 가능하며, 스레드 간 정보 전달에 사용되지만, 코드 이해를 어렵게 하고 스레드 안전성을 보장하지 못하며 초기화 순서에 의존하는 문제를 야기할 수 있다. - 객체 지향 프로그래밍 - Is-a
Is-a 관계는 객체 지향 프로그래밍에서 한 유형이 다른 유형의 하위 유형임을 나타내는 관계로, 상속, 서브타이핑, 리스코프 치환 원칙과 관련되며, C++, Python, Java 등에서 표현된다. - 객체 지향 프로그래밍 - 객체 (컴퓨터 과학)
객체는 객체 지향 프로그래밍에서 데이터와 조작을 묶어 메시지를 수신하고, 프로그램의 개념을 표현하며 가시성과 재사용성을 높이는 실체이다.
멤버 변수 | |
---|---|
정의 | |
설명 | 멤버 변수는 특정 객체와 연결되어 해당 객체의 모든 메서드에서 접근할 수 있는 변수이다. |
특징 | |
소속 | 클래스의 멤버 (클래스 변수) 또는 클래스에서 인스턴스화된 객체의 멤버 (인스턴스 변수)이다. |
선언 위치 | 클래스 내부에 선언되어야 하지만, 클래스 메서드 내부에는 선언할 수 없다. |
2. 멤버 변수와 지역 변수
프로그래밍에서 변수는 데이터를 저장하는 공간이다. 변수는 크게 멤버 변수와 지역 변수로 나뉜다. 멤버 변수는 클래스 내에 선언되며 객체의 속성을 나타낸다. 반면 지역 변수는 메서드나 함수 내에 선언되어 해당 메서드나 함수가 실행되는 동안에만 임시적으로 존재한다.[1]
2. 1. 멤버 변수 (Member Variable)
멤버 변수는 클래스 내에 선언되며, 객체의 속성을 나타낸다. 객체가 생성될 때 함께 생성되며, 객체가 소멸될 때까지 유지된다. 객체의 상태를 저장하고, 객체의 메서드에서 접근하여 사용하거나 변경할 수 있다.[1] C++, Java, Python, Ruby, PHP, Lua 등 다양한 프로그래밍 언어에서 지원된다.[1]접근 제한자(public, protected, private)를 사용하여 변수의 접근 범위를 제어할 수 있다.[1]
다음은 PHP 예제이다:[1]
```php
class Example
{
/**
- 예시 인스턴스 멤버 변수.
- 멤버 변수는 public, protected 또는 private 일 수 있습니다.
- @var int
- /
public int $foo;
/**
- 예시 정적 멤버 변수.
- @var bool
- /
protected static int $bar;
/**
- 예시 생성자 메서드.
- @param int $foo
- /
public function __construct(int $foo)
{
// foo 설정.
$this->foo = $foo;
}
}
// 새로운 Example 객체 생성.
// "foo" 멤버 변수를 5로 설정.
$example = new Example(5);
// "foo" 멤버 변수를 10으로 덮어쓰기.
$example->foo = 10;
// 10을 출력합니다.
echo $example->foo;
2. 2. 지역 변수 (Local Variable)
지역 변수는 함수나 메서드 내에 선언되며, 해당 함수나 메서드가 실행되는 동안에만 존재한다. 함수나 메서드의 실행이 종료되면 자동으로 소멸된다. 주로 임시적인 데이터를 저장하거나 계산 결과를 저장하는 데 사용된다.[1] C++, Java 등 다양한 프로그래밍 언어에서 지원된다.[1]C++ 예시:
```cpp
#include
class Foo {
int bar; // 멤버 변수
public:
void setBar(const int newBar) { bar = newBar; }
};
int main() {
Foo rect; // 지역 변수
return 0;
}
```
Java 예시:
```java
class Program {
static void main(final String arguments[]) {
// 이것은 로컬 변수이다. 이 변수의 수명은
// 어휘 범위에 의하여 결정된다.
Foo foo;
}
}
class Foo {
// 이것은 멤버 변수이다. 이 변수의 새로운
// 인스턴스는 Foo의 각각의 새로운
// 인스턴스들을 위해 만들어진다. 이 변수의
// 수명은 Foo의 "this" 인스턴스의 수명과
// 동일하다.
int bar;
}
3. 프로그래밍 언어별 예제
cpp
#include
class Foo {
int bar; // 멤버 변수
public:
void setBar (const int newBar) { bar = newBar; }
};
int main () {
Foo rect; // 지역 변수
return 0;
}
```
C++에서 멤버 변수는 클래스 내에, 지역 변수는 함수나 메소드 내에 선언된다. `bar`는 `Foo` 클래스의 멤버 변수이고, `rect`는 `main` 함수 내의 지역 변수이다.
```java
class Program {
static void main(final String arguments[]) {
// 이것은 지역 변수이다. 이 변수의 수명은
// 어휘적 범위에 의하여 결정된다.
Foo foo;
}
}
class Foo {
// 이것은 멤버 변수이다. 이 변수의 새로운
// 인스턴스는 Foo의 각각의 새로운
// 인스턴스들을 위해 만들어진다. 이 변수의
// 수명은 Foo의 "this" 인스턴스의 수명과
// 동일하다.
int bar;
}
```
Java에서 멤버 변수는 클래스 내에, 지역 변수는 함수나 메소드 내에 선언된다. 멤버 변수는 `Foo` 클래스의 각 인스턴스에 대해 생성되며, 지역 변수의 수명은 어휘적 범위에 의해 결정된다.
```python
class Foo:
def __init__(self):
self._bar = 0
@property
def bar(self):
return self._bar
@bar.setter
def bar(self, new_bar):
self._bar = new_bar
f = Foo()
f.bar = 100
print(f.bar)
```
Python에서 멤버 변수는 `self` 키워드를 사용하여 접근한다. `@property` 데코레이터를 사용하여 getter, setter 메서드를 정의할 수 있다.[1]
```lisp
(defclass foo () ((bar :initarg :bar :accessor bar)))
(defvar f (make-instance 'foo :bar 100))
(print (bar f))
```
커먼 리스프에서 `defclass` 매크로를 사용하여 클래스를 정의하고, `:initarg`, `:accessor` 옵션을 사용하여 멤버 변수를 정의한다. `foo` 클래스는 `bar` 멤버 변수를 가지며, `make-instance`로 생성된 `foo` 클래스 인스턴스의 `bar` 멤버 변수 값은 `(bar f)`로 가져온다.
```ruby
# Ruby는 클래스 변수, 클래스 인스턴스 변수, 인스턴스 변수 등 세 가지 유형의 멤버 변수를 가진다.
class Dog
# 클래스 변수는 클래스 본문 내에서 두 개의 @ 기호로 정의되며, 모든 Dog 및 파생된 Dog 품종(있는 경우)에 대한 데이터를 설명한다.
@@sniffs = true
end
mutt = Dog.new
mutt.class.sniffs #=> true
class Poodle < Dog
# "클래스 인스턴스 변수"는 클래스 본문 내에서 단일 @ 기호로 정의되며, Poodle 클래스에 대한 데이터만 설명한다. 상위 클래스나 Poodle에서 파생된 하위 클래스에 대해서는 아무런 언급을 하지 않는다.
@sheds = false
# 새로운 Poodle 인스턴스가 생성될 때, 기본적으로 훈련되지 않는다. 'trained' 변수는 initialize 메서드에 로컬이며 인스턴스 변수 @trained를 설정하는 데 사용된다.
# 인스턴스 변수는 인스턴스 메서드 내에서 정의되며 Poodle 인스턴스의 멤버이다.
def initialize(trained = false)
@trained = trained
end
def has_manners?
@trained
end
end
p = Poodle.new
p.class.sheds #=> false
p.has_manners? #=> false
```
Ruby는 클래스 변수, 클래스 인스턴스 변수, 인스턴스 변수 등 세 가지 유형의 멤버 변수를 가진다.
```php
class Example
{
/**
public int $foo;
/**
protected static int $bar;
/**
public function __construct(int $foo)
{
// foo 설정.
$this->foo = $foo;
}
}
// 새로운 Example 객체 생성.
// "foo" 멤버 변수를 5로 설정.
$example = new Example(5);
// "foo" 멤버 변수를 10으로 덮어쓰기.
$example->foo = 10;
// 10을 출력.
echo $example->foo;
?>
```
PHP에서 멤버 변수는 `public`, `protected`, `private`으로 선언될 수 있다.
```lua
local example_c = {}
local example_mt = {__index = example_c}
function example_c.new(foo)
return setmetatable({
foo = foo
}, example_mt)
end
local example = example_c.new(5)
example.foo = 10
print(example.foo)
```
Lua에서 객체는 테이블로 표현되며, 멤버 변수는 테이블의 키-값 쌍으로 저장된다. `setmetatable` 함수를 사용하여 메타테이블을 설정하고, 객체 지향 프로그래밍을 구현한다.
3. 1. C++
cpp
#include
class Foo {
int bar; // 멤버 변수
public:
void setBar (const int newBar) { bar = newBar; }
};
int main () {
Foo rect; // 지역 변수
return 0;
}
```
C++에서 멤버 변수는 클래스 내에 선언되며, 지역 변수는 함수나 메서드 내에 선언된다. 위의 코드에서 `bar`는 `Foo` 클래스의 멤버 변수이고, `rect`는 `main` 함수 내의 지역 변수이다.
3. 2. Java
java
class Program {
static void main(final String arguments[]) {
// 이것은 지역 변수이다. 이 변수의 수명은
// 어휘적 범위에 의하여 결정된다.
Foo foo;
}
}
class Foo {
// 이것은 멤버 변수이다. 이 변수의 새로운
// 인스턴스는 Foo의 각각의 새로운
// 인스턴스들을 위해 만들어진다. 이 변수의
// 수명은 Foo의 "this" 인스턴스의 수명과
// 동일하다.
int bar;
}
```
Java에서 멤버 변수는 클래스 내에 선언되며, 지역 변수는 함수나 메소드 내에 선언된다. 멤버 변수는 `Foo` 클래스의 각 인스턴스에 대해 생성된다. 지역 변수의 수명은 어휘적 범위에 의해 결정된다.
3. 3. Python
Python에서 멤버 변수는 `self` 키워드를 사용하여 접근한다. `@property` 데코레이터를 사용하여 getter, setter 메서드를 정의할 수 있다.[1] 아래는 `@property` 데코레이터를 활용한 예시이다.
```python
class Foo:
def __init__(self):
self._bar = 0
@property
def bar(self):
return self._bar
@bar.setter
def bar(self, new_bar):
self._bar = new_bar
f = Foo()
f.bar = 100
print(f.bar)
3. 4. Common Lisp
lisp
(defclass foo () ((bar :initarg :bar :accessor bar)))
(defvar f (make-instance 'foo :bar 100))
(print (bar f))
```
커먼 리스프에서 `defclass` 매크로를 사용하여 클래스를 정의하고, `:initarg`, `:accessor` 옵션을 사용하여 멤버 변수를 정의한다. 위 코드는 `foo` 클래스를 정의하고 `bar`라는 멤버 변수를 선언한다. `make-instance`를 통해 `foo` 클래스의 인스턴스를 생성하고 `bar` 멤버 변수에 100을 할당한다. `(bar f)`는 `f` 인스턴스의 `bar` 멤버 변수 값을 가져오는 코드이다.
3. 5. Ruby
ruby
# Ruby는 클래스 변수, 클래스 인스턴스 변수, 인스턴스 변수 등 세 가지 유형의 멤버 변수를 가진다.
class Dog
# 클래스 변수는 클래스 본문 내에서 두 개의 @ 기호로 정의되며, 모든 Dog 및 파생된 Dog 품종(있는 경우)에 대한 데이터를 설명한다.
@@sniffs = true
end
mutt = Dog.new
mutt.class.sniffs #=> true
class Poodle < Dog
# "클래스 인스턴스 변수"는 클래스 본문 내에서 단일 @ 기호로 정의되며, Poodle 클래스에 대한 데이터만 설명한다. 상위 클래스나 Poodle에서 파생된 하위 클래스에 대해서는 아무런 언급을 하지 않는다.
@sheds = false
# 새로운 Poodle 인스턴스가 생성될 때, 기본적으로 훈련되지 않는다. 'trained' 변수는 initialize 메서드에 로컬이며 인스턴스 변수 @trained를 설정하는 데 사용된다.
# 인스턴스 변수는 인스턴스 메서드 내에서 정의되며 Poodle 인스턴스의 멤버이다.
def initialize(trained = false)
@trained = trained
end
def has_manners?
@trained
end
end
p = Poodle.new
p.class.sheds #=> false
p.has_manners? #=> false
3. 6. PHP
php
class Example
{
/**
public int $foo;
/**
protected static int $bar;
/**
public function __construct(int $foo)
{
// foo 설정.
$this->foo = $foo;
}
}
// 새로운 Example 객체 생성.
// "foo" 멤버 변수를 5로 설정.
$example = new Example(5);
// "foo" 멤버 변수를 10으로 덮어쓰기.
$example->foo = 10;
// 10을 출력.
echo $example->foo;
?>
3. 7. Lua
lua
local example_c = {}
local example_mt = {__index = example_c}
function example_c.new(foo)
return setmetatable({
foo = foo
}, example_mt)
end
local example = example_c.new(5)
example.foo = 10
print(example.foo)
Lua에서 객체는 테이블로 표현되며, 멤버 변수는 테이블의 키-값 쌍으로 저장된다. `setmetatable` 함수를 사용하여 메타테이블을 설정하고, 객체 지향 프로그래밍을 구현한다.
참조
[1]
웹사이트
Q - What is a member variable?
http://www.dickbaldw[...]
Richard G Baldwin Programming Tutorials
1999-03-10
[2]
웹인용
Q - What is a member variable?
http://www.dickbaldw[...]
Richard G Baldwin Programming Tutorials
1999-03-10
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com