개체지향프로그래밍이란- 프로그램을 개체와 개체간의 상호작용으로 돌아가는것으로 보고 여기서 개체가 가지는 상태(멤버변수)가 무엇인지, 개체의 행동은 어떤것이 있는지, 개체가 다른 개체와 어떻게 상호작용할 것인지 등을 고려해서 하는 프로그래밍. 절차적프로그래밍은 프로그래머가 짠 코드가 순차적으로 실행되며 프로그램이 돌아간다는 의미. 개체지향프로그래밍이든 어떤 프로그래밍이든 결론적으로는 절차적인 코드의 실행으로 프로그램이 실행된다.
개체지향프로그래밍의 4대 특성
1.캡슐화 - 개체를 구성하는 상태(멤버변수)와 그에 작용하는 동작(메서드)가 한 클래스에 있다. 한 개체의 상태는 그 개체에서밖에 고치지 못하게 한다. 자바의 String문자열에서 String s = "hello"; s[0] = 't'; 또는 s.charAt(0) = 't'; 이런게 안되게 하는게 캡슐화를 지킨 설계라고 볼 수 있다.(외부에서 함부로 개체의 상태를 바꿀 수 없도록). 코드(클래스)사용자는 코드(클래스)설계자가 볼 수 있도록 허용한 부분만 사용할 수 있으면 되는데, 클래스의 상태가 어떤것들이 있는지 사용자는 모르게 하는것이 추상화(data abstraction) 이고 캡슐화를 통해서 이것이 이뤄질 수 있다. 즉 추상화는 캡슐화를 통해 이뤄질 수 있다. 사용자는 게터, 세터를 통해서 개체내부의 상태에 대해 알 수 있다.(없을수도) 개체의 상태를 바꿀수 있는 setter 의 경우 필요한 곳에만 쓰는것이 좋다.(Access modifier설정을 통해 특정 패키지에서만 쓰는것도 좋을듯?) 개체의 상태(멤버변수)에 대해 밖에서 수정할 수 있다는 점이 캡슐화를 깰 수 있기 때문이다.
2.추상화 - 여러 클래스간의 공통된 부분을 추출해 상위 클래스로 그 특징(상태가 됐든 동작이 됐든)을 넘기는 것도 추상화라고 볼 수 있지만(추상화와 일반화가 혼용되어 쓰이는 듯 하다.) 여기선 위 캡슐화를 설명할 때 설명한 추상화를 말한다. 클래스의 상태가 무엇무엇이 있는지 사용자는 모르게 한다(몰라도 되기 때문에. 모든것을 알 필요는 없다.) 상태(멤버변수)의 접근제어자(access modifier)를 private으로 놓는다. 필요하면 getter를 통해 얻으면 된다. 캡슐화와 추상화는 동떨어진 개념이 아니다.
-생성자의 필요성(역할)-
생성자는 개체의 생성과 동시에 개체의 유효성을 보장한다. 이 과정에서추상화가 일어난다. 생성자를 통해서 사용자는 개체의 상태를 정한다. 허나 클래스의 모든 상태에 접근하지 않을 수 있다.(필요한 부분만 접근)
클래스설계자는 사용자가 개체에 설정해줬으면 하는 부분만 파라미터로 받게끔 만든다. 모든 상태를 코드사용자에게 public하게 공개했을 경우 특정 상태가 클래스설계자의 의도와는 다르게 설정되어 개체의 유효성이 불안정해질 수 있다. (사용자는 어떤 멤버변수를 초기화 해야하는지, 어떤값으로 초기화해야하는지 모를 수 있다. 실수할 가능성이 높아진다.)
3.상속
어떤 클래스가 있고, 그 클래스의 특성 + 무언가(상태 또는 동작)를 갖는 클래스를 만드는것. extends 키워드를 사용해 구현
사람이라는 클래스가 있을때, 이를 상속받는 학생이라는 클래스가 존재할 수 있음. 다형성의 필수조건. 사람 클래스를 만들고 학생,선생 등의 클래스를 만들수도 있지만, 학생클래스를 만들고 선생클래스를 만들고 보니 두 클래스가 동일한 특성을 갖는것이 보일때 이를 상위클래스로 놓고(사람 클래스) 이를 상속받도록(상위클래스의 특성을 가지도록)만들 수 있다.(일반화)
4.다형성(Polymorphism)
같은 지시를 내렸는데(메서드 호출) 다른 행동을 하는것을 다형성이라고 함. 상위클래스를 상속받은 하위클래스에서 메서드를 재정의(overriding)하면 다형성을 챙길 수 있다. 동물클래스의 짖는 메서드 void bark();
개 클래스에서 오버라이딩후 호출시 콘솔에 "월월" 출력. 고양이 클래스에서 오버라이딩 후 호출시 콘솔에 "냐옹" 출력.
배열이나 컬렉션같은 곳에 같은 껍데기(Animal) 로 개체를 저장후, 반복문으로 한꺼번에 처리할 때 유용하다.
for(Aniaml animal : HashSet<Animal> animals) { animal.bark();}
다형성을 사용한다는것은 late binding 함수를 사용한다는것. 자바의 경우 final 키워드를 사용하지 않는다면 기본적으로 c++에서의 virtual method이고 이것은 컴파일타임에 메서드가 결정되는것이 아닌(함수주소가 링크되는것이 아닌) 런타임에 가상테이블을 통하며 오버라이딩하는 메서드가 결정되는 것이기 때문에 성능상 느릴 수 있다. 이부분은 jvm쪽을 더 공부하거나 툴을 통해 측정해봐야 할 것 같다.
JAVA) Anonymous Class (0) | 2025.03.03 |
---|---|
JAVA) try - with - resources (1) | 2025.03.03 |
우아한테크코스 웹 백엔드 7기 프리코스 4주차 회고 (0) | 2024.12.06 |
우아한테크코스 웹 백엔드 7기 프리코스 3주차 회고 (0) | 2024.12.05 |
우아한테크코스 웹 백엔드 7기 프리코스 2주차 회고 (2) | 2024.10.30 |
댓글 영역