무결성을 위해서
필드들은 웬만하면 private으로 선언해서 처리하는게 좋을까요?
[일반] 웅아들 뽑뽀쫙쫙 질문점여
섀내기(explorer7312)
2024-03-29 10:06
추천 0
댓글 32
다른 게시글
-
한국 교육이 학습이란거에 대한 잘못된 인식을 주는거 같음 [5][일반] 익명(118.235) | 24.03.29추천 0
-
대기형 학습방향 질문점요.. [20][일반] 익명(39.116) | 24.03.29추천 0
-
근데 비전공따리들 전공 뭐임?? [30][일반] 익명(222.99) | 24.03.29추천 0
-
요즘 경력이 슬슬 3년서 5년으로 올라가는거같더라 [2][일반] 익명(218.48) | 24.03.29추천 0
-
Spring 공부법 관련 질문 [3][일반] 익명(125.128) | 24.03.29추천 0
-
개발 적성은 논리적인 삽질 같음[일반] 익명(223.39) | 24.03.29추천 0
-
노드 백엔드 공부 어떻게해야하나요? [5][일반] 보거스(211.51) | 24.03.28추천 0
-
작년보다 티오 더 없는거같다 [4][일반] 익명(211.213) | 24.03.28추천 1
-
백엔드 쪽으로 취업 하고 싶어서 자바 공부중입니다.. 쓴소리 부탁 [31][일반] 익명(121.161) | 24.03.28추천 0
-
cs만 파도 취업하는 곳 [6][일반] 익명(1.243) | 24.03.28추천 1
무결성이 뭘까요? 필드를 private 로 하면 반드시 무결성이 지켜 지나요?
무결성 결점이 없는 성질 아니에요? public으로 해서 사용자가 값을 임의로 바꾸게 돼서 프로그램 결점 생길 수 있으니까 private으로 값을 못바꾸게 하면 그 부분에 대해선 무결성을 만족시키는거 아닙니까?
결점? 단어가 조금 애매하네요 캡슐화를 말씀하시는거 같은데
private 선언해도 setter 메서드를 만들면 필드 값은 수정될 수 있지 않을까요?
왜 캡슐화를 하셔야 하나요?
엇,, 그러네요 슈발 ㅠㅠ
캡슐화 같은건 내부코드를 숨겨서 안정성을 위한거 아녀요? 근데 말씀처럼 setter로 바꿀 수 있으면 안정성 말곤 얻을게 없는건가요
근데 캡슐화랑 정보은닉을 통해서 안정성을 만들면 무결성에 가까워지는거 아닌가요?
만드시고자 하는 객체의 필드가 생성된 이후 반드시 변하면 안된다고 한다면 말씀하신대로 private 으로 막고 setter 는 만들지 않고 getter 형태의 메서드만 만드시면 구현하실 수 있겠네요.
맞습니다 무결성에 가까워 지는데 무결성은 결점이 없는 성질이 아니라 데이터의 일관성을 의미하는게 더 정확하다고 생각합니다.
https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AC%B4%EA%B2%B0%EC%84%B1
아하 그렇군요 감사합니다 당연하게 그냥 키워드 치던 습관이 부끄럽네요 이런 생각을 하면서 코딩을 해야 했는데,, 근데 객체가 반드시 변하면 안되면 final 키워드 쓰는게 더 맞지 않나여?
명시적으로 final 을 선언해도 좋겠죠 ㅎㅎ 근데 혹시 만들고자하시는게 일급컬렉션이라면? final 키워드가 일급컬렉션의 멤버변수 리스트의 불변을 반드시 보장할까요?
아 private이 그런 의미도 있는거군요 감탄스럽네요 엉아 그래서 결론적으로 자바는 캡슐화를 지향하니까 필드에 대한건 private으로 선언하는게 일반적인건가요?
네 캡슐화는 클래스의 무결성을 위해서 지향하고 그러면 자연스럽게 private 같은 접근제한자를 쓰게 되겠죠. 제가 드리고 싶은 말씀은 실제 구현에서 요구하는 요구사항을 만족하기 위해서는 단순한 캡슐화가 아닌 여러가지를 생각하면서 클래스를 설계해야할 일이 많아서 무언가를 할때 너무 정답을 찾지말고 상황에 맞는 적절한 설계를 고민하는 자세가 더 좋을것 같아요.
그렇군요 절대적인 방법론은 없는거네요 고맙습니다 진짜!!
캡슐화란 뭘까요? 정보 은닉이란 뭘까요?
캡슐화를 위해서 private 처리를 하는거고 그렇게 함으로써 정보은닉 무결성 일관성을 얻을 수 있는거고
내 생각을 말하자면, 자바에서 private public은 속성에 문맥적 의미를 구분하는거라 본다. 사실 대부분의 private 필드는 게터세터를 붙혀서 거진 public과 다를바가 없음.
게터나 세터를 의도한대로 제어할 수 있다는 측면에서는 매우 다르다고 생각합니다.
그럼에도 불구하고 private을 사용하는건 해당 객체 내의 속성을 특정한 방식을 통해서만 드러낼 수 있게 한다는 일종의 문맥적 시맨틱에 가깝다 봄. 자바와 달리 파이썬의 경우 private자체가 없음.
의도대로 제어한다는게 무슨의미임??? 게터세터가 없어도 의도한대로 제어가 가능하지 않음? 그저 게터 세터 만들어서 타이핑하는거 자체에 과연 깊은 의도가 있는지 반드시 필요한지 의문임
애초에 객체지향 패러다임으로 설계된 언어는 거의 100% private 같은 접근제한자가 있죠. 파이썬은 그게 아닌거고 문맥적 시맨틱이자 게터 세터에 의도를 넣어 설계하라는 구조적 지침의 역할, 협업에서의 휴먼 에러 방지까지 해주는 매우 많은 역할을 한다고 생각합니다. 단순 퍼블릭선언하고 아주 다르다고 생각해요.
게터와 세터를 통해 접근하는 모든 방식은 퍼블릭으로 접근하는것과 논리적인 상황 자체는 동일하다고 생각함.
나도 public과 private은 분명 다르다고 생각은 함. 근데 나는 public과 private에서 private으로 선언하여게터 세터를 만들어서 접근하는 방식이 문법적 요소보다는 의미론적 시맨틱을 부여하는게 더 크지 않나 하는거임
자바에서 특정 필드를 non-null 로 관리 하고 싶으면 public 으로는 보장할 수 없지만 private 으로 감추고 생성자와 setter 에서 컨트롤하면 가능하겠죠. 이래서 단순 선언이 아니라 기능적으로 다른 구조를 만들수 있는 아이디어라고 생각해요. 말씀해주신 케이스는 아주 단순하게 게터와 세터를 사용하는 경우인데 그런경우에는 말씀하신대로 사실 다를바가 없죠. 하지만 저희가 항상 그런것만 만들지 않잖아요? 그래서 public 과 private 이 존재하는거고 객체지향 패러다임에서 자주 사용하는 아이디어라고 생각합니다.
너 말이 맞는듯
깊이 있는 대화 멋져요.. 이런 레벨이 되려면 오래 걸릴까요
객체는 주어진 역할을 수행하는 범위 내에서는 그 자체로 완전해야함. 핵심은 필드가 아니라 행동 = 메소드 인거고 필드는 상수가 아니라면 언제든지 바뀔 수 있는 객체 내부의 상태일 뿐임 근데 문제는 그 상태가 객체 내부의 행위에 의해서만 바뀌어야 하는데 외부의 행위에 의해서 상태가 바뀌어 버리면 결과론적으로 특정 객체에게 부여된 역할을 수행하기 위한 자체의 행동 결과가 의도한대로 도출되지 않음 그래서 기본적으로 필드는 private으로 설정하고 객체가 어떤 역할을 부여받았는지에 따라 게터 세터를 설정해서 외부의 상황에 따라 어떻게 변화시킬지 설정해두는거.
아래 댓글처럼 게터세터는 어지간하면 다 붙이기 때문에 큰 의미가 없어보이지만 바뀌면 안되는 경우에는 게터만 생성해서 개발 시에 의도를 확인할 수 있다는게 좀 큼
+
간단하게 말해서 객체 내부의 행위에 의해서만 상태가 바뀔 수 있게 하는 특별한 메소드가 게터세터 인거고, 캡슐화를 위해서는 private로 선언해야함.