1.클래스, 객체 지향 프로그래밍, 접근 제한자
클래스는 자바의 핵심 개념이다. 모든 java파일이 클래스 개념으로 돌아간다고 생각한다.
먼저 객체 지향 프로그래밍을 이해해야 하는데 객체지향 프로그래밍이란 객체, Object를 이용한 프로그래밍이고
객체란 현실상의 대상을 추상화하여 프로그램 상에서 구현한 결과물이다.
대상의 각각의 요소들을 합쳐 완전한 대상을 구현하는 것을 객체 지향 프로그래밍이라고 할 수 있다.
객체 지향 프로그래밍의 특징으로는 추상화(Abstraction), 캡슐화(EnCapsulation), 상속(Inheritance), 다형성(Polymorphism)이 있고
각각의 특징은 뒤에 다시 자세하게 설명하겠다.
클래스는 객체를 만들기 위한 설계도이다. 흔히 붕어빵 틀과 같은 것으로 비유를 한다. 처음 이해할 때에는 좋은 비유이다.
클래스가 다양한 변수, 메소드 등의 정보를 담고있고 그 정보를 통해 제작한 것이 객체이다.
객체를 만드는 것을 객체화, 인스턴스화라고 하며 메모리의 Heap 영역에 할당이 된다.
뒤에 나오는 Static을 배우면 붕어빵 틀과 같은 개념이 전부 무너지기 때문에 틀이라는 것에 너무 얽매이면 안된다.
여지껏 Main 클래스를 만들 때의 Main도 클래스의 하나이고 public static void main(){}도 Main의 메소드 중 하나이다.
package chap04.exam01.classDefine;
public class Main { // Main클래스는 하나의 분류가 된다.
// Main 클래스에 속해 있는 메서드
public static void main(String[] args) {
}
}
package chap04.exam01.classDefine;
public class Sub {
// 첫 문자가 대문자 인가?
// 특수문자를 사용 했나? ($, _제외)
// 파일명과 클래스 명이 일치 하는가?
// 안의 메서드와 필드들이 대표하는 이름인가?
}
클래스 선언과 객체화는 아래와 같다.
package chap04.exam02.classIns;
public class Main {
public static void main(String[] args) {
// Student 를 새롭게(new) 복사하여 담는다.
// 변수의 형태는 담을 객체의 형태여야 한다.
Student std = new Student();
System.out.println(std);
}
}
package chap04.exam02.classIns;
public class Student {
// 이름으로 봤을 때 학생에 관련된 내용이 있을것으로 예상할 수 있게 작명
}
객체화시에는 이름을 다르게 해서 여러개의 복사본을 만들 수 있는데 원본은 Student로 같지만 이름은 전부 다르고 각각의 객체들도 다르게 취급된다.
현실에서도 고등학생이라고 전부 똑같은 사람이 아니라 개성이 있고 이름도 다르다.
그리고 Student 클래스를 선언하고, 선언 할 때에는 누구든지 이게 어떤 내용일지 대강 알아야 한다.
왜냐하면 자바는 특성상 여러사람이 공유하여 사용 할 수 있는 확장성이 있고 실제로도 프로그래밍은 절대 혼자하는게 아니기 때문이다.
어쨋든 메인에서
Student std 로 클래스를 선언하고
= new Student(); 와 같이 객체화 한다.
필자가 받은 느낌으로는 그냥 특별한 변수를 만들어서 선언하고 초기화 하는것과 매우 유사해서 이해하기 쉬웠다.
2.접근 제한자
접근 제한자란 클래스를 통해 객체화 되어 변수나 메소드를 사용할 권한을 지정하는 것이다.
접근 제한자는 객체 지향 언어에서 캡슐화와 관련이 있고 public부터 시작해서 겉껍질, 제일 안쪽에 private으로 캡슐 구조라고 말한다.
클래스 선언 시 변수와 메서드 맨 앞에 명명하며 다음과 같이 사용한다.
[접근 제한자] [static] [변수 명];
[접근 제한자] [static] [반환 타입] [메소드 명]([매개변수]){ [내용] };
종류로는 아래와 같이 있다.
+ : public으로 선언
- : private으로 선언
# : protected로 선언
~ : default, package를 의미
3.클래스 다이어그램
먼저 클래스 다이어그램을 그릴 수 있는 사이트를 소개한다.
https://www.draw.io
클래스 다이어그램 뿐만 아니라 플로우 차트, 표, 차트 등 다양한 그리기 도구를 지원한다.
사이트에 접속하면 처음에 어디에 저장 할 것인지 물어보는데 원하는 위치에다 설정하고
Create new diagram - Software - 첫번째를 선택하면 클래스 다이어그램을 간편하게 그릴 수 있다
클래스 다이어그램이란 프로젝트 안에 있는 클래스들의 관계를 그림으로 표현 한 것 이다.
눈에 익기만 한다면 프로그램이 어떻게 돌아가는지 쉽게 파악 할 수 있게 되고 실무에서도 문서를 읽거나 작성할 때 좀 더 편할 것이다.
아래 그림을 보고 이해해 보자
클래스 다이어그램 예제와 기호 설명 |
|
첫번째 블록 : 클래스 명
두번째 블록 : 멤버 변수
세번째 블록 : 매개 변수
두번째 블록
[접근제한자] [변수 명] : [타입]
*밑줄은 static으로 선언되었음을 표현
세번째 블록
[접근제한자] [매개 변수 명][(인자종류)] : [타입]
예제 해석
Article 클래스
private로 선언된 String 타입 name 변수
private로 선언된 String 타입 contents 변수
public static으로 선언된 String 타입
PAGENAME_SUFFIX 변수
public으로 선언된 getName 매개변수, 반환값은 String
public으로 선언된 setName 매개변수, 인자는 String 타입 newName, 반환값은 없음
public으로 선언된 getContents 매개변수, 반환값은 String
public으로 선언된 setContents 매개변수, 인자는 String 타입 newContents, 반환값은 없음 |
|
Association : 대상 클래스를 변수로 사용하는 관계
Inheritance : 상속 관계를 의미함
Implementation : 인터페이스를 불러옴
Dependency : 상속하여 대상 클래스의 변수 메서드 등을 사용
Aggregation : 추후 추가
Composition : 추후 추가 |
|
접근 제한자 표기
+ : public으로 선언
- : private으로 선언
# : protected로 선언
~ : default, package를 의미
Derived, Random은 생략 |
클래스 다이어그램 예제 출처 : https://zetawiki.com/wiki/클래스_다이어그램
화살표 및 기호 출처 : https://en.wikipedia.org/wiki/Class_diagram