객체에 속성, 상태 및 동작이 있다고 말할 수 있습니까?


16

Oracle의 OOP 개념 소개를 읽고이 설명을 보았습니다.

실제 객체는 두 가지 특성을 공유합니다. 모두 상태와 동작이 있습니다. 개는 상태 (이름, 색깔, 번식, 배고픈)와 행동 (짖는 소리, 가져 오기, 흔들기 꼬리)이 있습니다. 소프트웨어 객체는 개념적으로 실제 객체와 유사합니다. 상태 및 관련 동작으로 구성됩니다.

그 구절에 대한 나의 문제는 상태를 묘사 할 때 그 속성 도 혼합 한다는 것입니다. 예를 들어, 개의 이름과 색깔은 그 속성이며, 배고프거나 목이 마르는 것은 그 상태입니다.

내 의견으로는 객체의 특성을 속성, 상태 및 동작의 세 부분으로 나누는 것이 더 정확합니다 .

물론 이것을 프로그래밍 언어로 번역 할 때 속성과 상태가 모두 필드 / 변수에 저장되고 동작은 메소드 / 함수에 저장되기 때문에 3 배 파티션이 2 배 파티션이되는 것을 알 수 있습니다.

그러나 개념적으로 말하면 세 가지를 분리하는 것이 더 합리적입니다.

또 다른 예가 있습니다 : 램프를 고려하십시오. 램프 크기와 전원이 켜져 있는지 여부는 상태에 따라 달라집니다. 램프 크기는 상태가 아닌 속성이며, 켜거나 끄는 상태는 상태입니다.

아니면 내가 뭔가를 그리워 했습니까?


4
그래, 당신은 행동을 시뮬레이션하는 기술로서 특성이 빠져 있습니다.
yannis

이 게시물을 살펴보면 도움이 될 것입니다. yegor256.com/2014/12/09/…
yegor256 December

답변:


13

인스턴스의 변하지 않는 특성을 의미하도록 속성을 정의하면 객체는 속성, 상태 및 동작으로 구성됩니다. 사실,이 구별을하는 것이 중요합니다. 왜냐하면 당신의 의미에서 속성 포함 하고 상태는없는 객체가 존재하기 때문입니다 . 그것들은 불변 이라고 불리며 프로그래밍에 매우 유용합니다.

이 세 부분으로 된 정의는 실제로 프로그래밍 언어로 표시됩니다 (예 : finalJava의 readonly키워드 또는 C # 의 키워드를 사용하여 인스턴스 수명 동안 변경되지 않을 수있는 인스턴스 데이터를 나타냄).

그러나 변경되지 않는 인스턴스 데이터는 일반적으로 속성이라고하지 않습니다. 우리는 사용하는 언어에 따라 '최종', '읽기 전용'또는 '일정한 데이터'라고 말합니다. 그들에게 적절한 용어는 '불변'이지만,이 단어는 이런 의미에서 자주 사용되지 않습니다. 다른 것들에 더 자주 사용됩니다.


인스턴스의 변경되지 않고 변화하는 특성이라는 용어를 생각하는 것이 합리적입니다. 그리고 나는 그렇게 멀지 않은 것이 기쁘다. 감사!
Daniel

제조 또는 조립 과정에서 램프의 크기가 상태가됩니까?
JeffO

아니요, 속성이 될 것입니다. (OP의 의미에서)
Mike Nakis

4
상태와 속성 사이에는 근본적인 차이가 없으므로 상태를 변경 가능하거나 변경 불가능한 것으로 정의하는 것이 더 간단합니다. (불변의) 속성과 (변동 가능한) 상태를 갖는 것은 부정확하지 않으며 (그리고 많은 의미에서 동등합니다), 그 구별은 정의를 필요 이상으로 복잡하게 만듭니다. 비록 IMO라는 용어는 "상태"라는 용어가 개념을 설명하는 데 가장 적합한 용어는 아니지만 "상태"는 어떻게 든 변경되어야한다는 것을 암시하지만 Oracle의 기사에 설명 된 "상태"에는 그 용어가 없습니다.
Lie Ryan

불변성에 대한 사람들의 입장은 시간이지나면서 변하고 있다고 생각합니다. 그것의 중요성을 이해하는 사람들에게는, 다른 이름을 보증하기에 변하기 쉬운 상태와 불변 상태의 근본적인 차이가 있습니다. 매우 흥미로운 독서를 권할 수 있습니까? Eric
Lippert-

4

객체에 두 가지 특성 만 있다고 말하는 것이 더 정확하다고 생각합니다. 오라클의 예를 들면 다음과 같습니다.

개는 상태 (이름, 색깔, 번식, 배고픈)와 행동 (짖는 소리, 가져 오기, 흔들기 꼬리)이 있습니다. 소프트웨어 객체는 개념적으로 실제 객체와 유사합니다. 상태 및 관련 동작으로 구성됩니다.

이름, 색상, 품종 및 배고픈 값 (상태) 이 객체에 속성으로 저장 되어 있다는 사실 은 구현 세부 사항입니다. 속성이 전혀 필요하지 않습니다.

속성을 세 번째 특성으로 포함하려는 경우 객체의 상태와 같은 동작이 변경 될 수 있으므로 메서드를 네 번째로 포함해야합니다. 상태와 동작은 객체의 두 가지 추상적 특성입니다. 속성과 메소드는 이러한 개념을 구체적으로 구현 한 것입니다.


여우의 털 색깔은 겨울에 변하기 때문에 상태가됩니까?
JeffO

@JeffO 모피 색상도 오래되고 젖었거나 염색되면 변할 수 있습니다. 실제로는 한 객체의 수명 동안 변경 될 수 있기 때문에 상태가 아니라 동일한 유형의 다른 객체가 해당 속성에 대해 다른 값을 가질 수 있기 때문입니다.
Bill the Lizard

1

상태는 속성과 해당 값의 집합이므로 내 관점에서 당신은 옳지 않습니다 (그리고 간단한 정의에 불필요한 추가 복잡성을 생성하고 있습니다).


0

우리는 무수한 방법으로 물건을 분류 할 수 있으며 각 분류에는 "정답"이 없을 것입니다. 분류가 좀 더 깊이 이해하거나 의사 소통을 향상시키는 경우에만 분류하는 것이 유리합니다. 팀이 속성, 상태 및 기능이라는 용어를 선호하고 이에 대한 작업 정의가 좋은 경우 내부 커뮤니케이션을 개선하는 데 도움이되지만이 그룹 외부에서 커뮤니케이션 할 때는 융통성이 있어야합니다.

"배고파"와 "목 마른"개념은 기본 속성 (예 : 혈당, 수화 수준)에서 파생 될 수 있으므로 상태를 기반으로 True 또는 False로 순환 할 수있는 기본 속성에서 파생 된 메타 속성으로 생각할 수 있습니다. 관련 기본 속성의 상태 조명 예제의 경우 조명이 속성 applied_voltageresistance기능 voltage_switch()및 을 갖는 것으로 생각할 수 shine()있습니다. 는 voltage_swich()다음 입력의 일부 (예를 들면 수동 스위치, 광, 타이머 등)의 함수와 shine()의 함수 applied_voltageresistance. light_state대상을 정신적으로 구성하는 데 도움이되는 True 또는 False 라고하는 메타 속성을 선언 할 수 있지만 결국 이러한 아이디어는 모두 작업을 구성하는 데 사용하는 정신적 인 구성입니다.


-2

객체의 상태는 해당 속성으로 직접 또는 간접적으로 인코딩 됩니다. 예를 들어, 개가 목이 마르도록하려면

private boolean thirsty;

또는 다음과 같은 것을 가질 수 있습니다.

private Date lastDrinkAt;

현재 시간과 마지막으로 마신 시간을 비교하여 개 인스턴스가 목이 마르는지 결론을 내립니다.

어느 쪽이든 객체의 상태는 해당 속성 내에 있습니다.

그런 다음 속성이없는 클래스, 주로 유틸리티 클래스가 있습니다. 그러나 일반적으로이 경우에도 인스턴스를 생성하고 싶지 않습니다.

진술에 대해 추론하기 위해 과학자들은 보통 최소한의 원칙을 고수합니다. 이것이 바로 오라클이 명시 적으로 상태를 언급하지 않은 이유라고 생각합니다. 속성 값에서 파생 될 수 있습니다.


1
오라클 명시 적으로 상태를 언급했습니다. 인용문을 읽으십시오. 그리고 OP는 분명히 객체의 변하지 않는 특성 이라는 의미에서 단어 속성 을 사용 하므로 상태와 혼동하지 않습니다.
Mike Nakis

그것들은 여전히 ​​변화하고 있거나 당신이 그들을 "속성"또는 "회원"이라고 부르든 여전히 특징입니다. 프로그래밍 세계에는 그 속성 외에 객체의 상태를 나타내는 다른 것은 없습니다.
Raku

-3

실제 연결이 잘못되었습니다. 내가 그것을 가르치는 방법은 다음과 같습니다 (c ++ 접근법) :

  1. 컴퓨터는 데이터와 코드의 두 가지 저장 형식을 지원합니다
  2. 데이터는 비트 010101010101처럼 보입니다.
  3. 코드는 asm 명령어처럼 보입니다.
  4. 데이터 비트는 서로 다른 두 가지 값을 갖습니다. 0 또는 1입니다.
  5. 데이터는 데이터 유형으로 추상화됩니다 : int i = 1; 비트 0000001에 대한 짧은 표기법입니다.
  6. 코드는 함수처럼 보일 것입니다 : int f (int a) {return a + a + a; } 일부 asm 명령어의 짧은 표기법입니다
  7. 여러 변수가있을 때 변수를 구조체에 결합합니다 : int a; 플로트 b; struct AB {int a; 플로트 b; };
  8. 코드 조각을 결합하면 클래스를 얻게됩니다. class ABf {int a; 플로트 b; float sum (float c) const {return a + b + c; }};
  9. 그런 다음 데이터의 경우 값을 찾는 데 사용할 수있는 변수 이름이 있습니다. a + b + c는 데이터에 액세스합니다.
  10. 그리고 정상적인 함수 호출이 있습니다 : int k = f (10); f- 함수 안에 "저장된"asm 명령어에 액세스합니다.
  11. 그런 다음 객체 인스턴스가 있습니다. ABf var;
  12. 그리고 멤버 함수는 다음을 호출합니다. int k2 = var.sum (10.0);
  13. 함수는 int f (int);
  14. 멤버 함수는 int ABf :: sum (float);
  15. ABf * 타입의이 포인터가 있습니다
  16. a 및 b 및 c와 같은 변수는 컨텍스트에 따라 달라집니다. 멤버 함수 내에있는 경우 this-> b 또는 b를 의미 할 수 있습니다.
  17. 멤버 함수 int ABf :: sum (float c)는 int sum (ABf * this, float c);
  18. "상태"라는 단어는 데이터와 동일한 의미 일뿐입니다.
  19. "행동"이라는 단어는 코드와 같은 의미입니다.
  20. "속성"이라는 단어는 데이터와 같은 의미 일뿐입니다.

따라서 상태와 속성 간에는 전혀 다른 것이 없습니다. 임의의 비트 모음입니다. 그것들을 분리하는 것은 임의의 구별입니다. 별명이 무엇인지 알아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.