객체지향프로그래밍 공부의 계기
JAVA를 공부하면서 가장 오묘하고 무슨소린지 모르겠던 것은 바로 객체지향이라는 것이다.
살면서 처음들어봤다. 객체지향.. 강사님이 열변을 토해도 아무것도 모르는 나에겐 그냥 추상적인 개념일 뿐 아무런 이해가 되지 않았다. 그런데 이제 JAVA 프로젝트를 시작해야하고 어떻게 효율적으로 효과적이게 잘 코드를 짤 수 있을까? 하고 생각을 하던 중 강사님의 "JAVA는 객체지향프로그래밍이다."라는 말이 떠올랐고 JAVA가 지향하는 방법을 따라가면 나의 고민에 대한 실마리가 있을까 싶어 열심히 찾아봤다.
캡슐화
캡슐화는 데이터 그리고 데이터를 활용하는 함수들을 캡슐 즉, 어떠한 컨테이너(Class) 안에 넣어 두는 것을 뜻한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class Student{
private String name;
private int age;
private int grade;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public int getGrade() {
return this.grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
|
cs |
만약 Student라는 Class가 없었다면 학생의 이름, 나이, 등급에 대한 데이터는 자신들의 소속이 어딘지도 모른채로 둥둥 떠다녔을 것이다.
우리가 동네 뒷산에 갔다고 생각해보자. 동네 뒷산에는 소나무도있고 여러 잡초들도 있고 벚꽃나무도 있을 것이다. 우린 하나하나보면 저 나무들이 어떤 나무인지 알고있다. 그러나 우리가 이 나무들을 관리해준다고생각하면? 물도 주고 해충도 관리해줘야하는데 각각의 나무들은 서로 다른 특성을 가지고있다. 이제 우리는 머리가 아프다. 반면에 식물원은? 소나무존, 꽃나무존, 잡초존 이렇게 나누어져있으니 우리는 한눈에 어떤 식물인지 알 수 있고 관리하기도 쉽다.
데이터도 동일하다. 데이터가 묶여져있지않으면 데이터 추가,수정등에 대해 관리하기도 힘들어지고 자연스럽게 보안에도 취약해질 것 이다.
캡슐화의 가장 궁극적인 목표는 정보은닉이다. 외부에서 내부의 정보에 접근하거나 변경할 수 없게 하기 위해 해당정보들을 private로 좌물쇠를 잠궈준 것이다. 그렇게 외부에서의 접근을 막았으며 이 데이터에 접근할 수 있는 열쇠가 바로 getter,setter이다.
즉, 캡슐화란 데이터들을 하나의 카테고리로 묶어 Class라는 이름으로 정리해준 후 private로 외부접근을 막을 수 있어 노출할 자료와 숨길 자료를 선택할 수 있다.
상속
상속은 코드를 작은단위로 쪼개고 재사용할 수 있게 하는 것이다.
아까 위의 예시를 바탕으로 여자학생, 남자학생을 나누어본다고 생각을 해보자.
그런데 여자학생이든 남자학생이든 기본적으로 밑의 이름,나이,등급은 모두 동일한 부분이다.
1
2
3
4
5
|
public class Student{
private String name;
private int age;
private int grade;
|
cs |
그렇다고 이걸 여자학생, 남자학생의 클래스에 하나씩 모두 변수를 선언하기엔 귀찮고 데이터낭비이다.
그래서 "상속"이라는 개념을 생각해내게된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class Student{
private String name;
private int age;
private int grade; }
public class StudentW extends Student{
private String gender;
public StudentW(int name, int age, int grade, String gender){
super();
this.gender = gender;
}
}
public class StudentM extends Student{
private String gender;
public StudentM(int name, int age, int grade, String gender){
super();
this.gender = gender;
}
}
|
cs |
extends와 super를 통해서 서로간의 class를 연결해두고 부모와 자식관계를 결정지어 공통된 요소를 super();를 통해 불러오기 하는 것이다. 이로인해 코드가 간결해지고 재사용이 쉽게되었다.
상속의 핵심 개념은 클래스를 확장하면 자식은 부모클래스의 모든 속성과 메서드를 확장하게 된다. 라는 것이다. 이는 즉, 부모클래스가 정해진 양식 그대로만 사용해야한다는 것이다.
https://songg5453.tistory.com/36?category=1010679
자바(java)_생성자,super
▶생성자 -. 생성자는 클래스가 생성이 될 때 자동으로 실행되어지는 특수한 형태의 메서드 -. 클래스의 이름과 동일한 이름을 가진다. -. 생성자는 클래스안에서의 그 어떤 메서드보다 먼저 실
songg5453.tistory.com
추상화
우리가 java를 사용할 때
1
2
|
Student st = new Student('김영희',29,1);
|
cs |
이런 코드를 많이 사용했을 것이다. Student에 대한 결과값을 다른 Class 즉, 외부에서 넘겨주는 것인데 이것이 바로 추상화다.
객체지향에서의 추상화란 사용자에게 불필요한 정보를 굳이 노출하지 않는 것이다. 사용자가 학생의 점수결과값을 넣거나 알고싶을 때 등급을 나누는 계산식이 무엇인지 어떤 함수가 들어가는지 세부실현정보를 알 필요가 없다.
또한 추상화를 하게된다면 어떠한 업그레이드나 속도향상을 위해 내부작업을 바꾸어도 결과값은 다른 class에 인터페이스로서 존재하기에 결과값을 수정할 필요가 없어 간편하다.
https://songg5453.tistory.com/51
자바(java)_추상화,추상 메서드,인터페이스,implements
▶추상화를 사용해야하는 이유 Unit이라고 하는 클래스에 attck()이라고 하는 메서드와 move()라고 하는 메서드를 추가했다고 가정을 해보자 그럼 자식클래가 AirForce, Navy, Army가 attck()과 move()라는 기
songg5453.tistory.com
다형성
다형성이란 오버라이딩을 뜻한다. 부모에게 규격만 상속받고 해당 내용은 자식이 새로 재정의하는 형태이다. 즉, 부모클래스에서 자식클래스로 일종의 양식, 틀을 제공하면 자식클래스는 그 틀 안에서 자유롭게 본인들의 능력을 펼칠 수 있는 것이다.
https://songg5453.tistory.com/43
자바(java)_오버로드(Overload)&오버라이드(Override)
▶오버로드(Overload) -. 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법이다. ▶오버라이드(Override) -. 부모클래
songg5453.tistory.com
내가 생각하는 객체지향은?!
객체들에 하나의 큰 카테고리를 주어 Class로 묶고 : 캡슐화
중복된 코드가 있으면 해당코드를 하나만 만들어 여럿이 사용하게 만들고: 상속
내부와 외부를 구분하여 세부구현을 은닉하고 수정에 용의하게만들며: 추상화
각자 다양한 기능을 만들 되 좀 더 편하게 만들기위해 하나의 틀을 제공하는: 다향성
이런 특성을 가지고있는 객체지향이 추구하는 바는
1. 코드를 한줄이라도 적게 사용하여 데이터 최소사용
2. 유지보수에 대한 효율의 극대화
인 것 같다. 뭔가 직장생활을 하면서 상사에게 배운 업무 꿀팁들이 정형화되어 책으로 나온 느낌이랄까?
어떤 게으른천재가 코드를 한줄이라도 더 줄이기위해 만들어낸 개념같기도 했다. 그만큼 최대한으로 축약하고 압축한건데 결국엔 객체지향은 지킬껀 지키고 편하게 개발하자는 느낌이다. 그럼 여기서 지켜야할 것들은 개발자들 사이에서도 빠지면 안되는 가장 중요한 개념이라고도 역으로 생각할 수 도 있겠다.
객체지향 말은 어렵게 다가왔지만 정리를 하니 결국 학원에서 모두 배운 내용이었다.
복습하는 느낌으로 공부하니 꽤 재밌고 알찬 공부였으며 프로젝트 코드의 방향성에 대해 공부하기 전 보다는 명확해진 것 같다.
'CS > CS지식' 카테고리의 다른 글
의존관계 주입이란? (0) | 2024.12.10 |
---|---|
DB의 프로시저란? (0) | 2022.08.15 |
정규화와 비정규화 (0) | 2022.07.25 |
HTTP란? (0) | 2022.05.25 |