9시에 못 일어날까봐 밤을 샜더니 정신이 몽롱한 달거북씨의 오늘의 공부.
자바 기초 때 배웠던 거랑 순서라든가 코딩이라든가 또 다른 느낌이라 매일매일이 새롭네 하하;
그리고 하루에 진도가 딱딱 나가는 게 아니라 둘째날까지 이어지는 내용이 있다 보니 정리하기도 곤혹스럽고 아마 읽는 사람도 정신없지 않을까 싶다.(만약 읽으시는 분이 있다면)
1. 클래스, 객체, 인스턴스
1-1. 클래스(Class)
- 객체를 만들어 내기 위한 설계도 혹은 틀
- 연관되어 있는 변수와 메서드의 집합
1-2. 객체(Object)
- 소프트웨어 세계에 구현할 대상
- 클래스에 선언된 모양 그대로 생성된 실체
- '클래스의 인스턴스(Instance)'라고도 부른다.
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.(▶완전 동일한 건 아니라고 하셨다.)
- OOP(Object Oriented Programming)의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
1-3. 인스턴스(Instance)
- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
- 즉, 객체를 소프트웨어에 실체화하면 그것을 '인스턴스'라고 부른다.
- 실체화된 인스턴스는 메모리에 할당된다.
- 인스턴스는 객체에 포함된다고 볼 수 있다.
- OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
class Animal{
...
}
public class Main{
public static void main(String[] args){
Animal cat, dog; // 객체
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'
// 객체를 메모리에 할당
dog = new Animal();
}
}
1-4. 클래스, 객체, 인스턴스 차이
- 클래스 vs 객체
→ 클래스는 "설계도", 객체는 "설계도로 구현한 모든 대상"을 의미한다. - 객체 vs 인스턴스
→ 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 대 인스턴스라고
부른다.
→ 객체는 현실세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
→ 객체를 '클래스의 인스턴스'라고도 부른다.
→ 엄격하게 객체와 인스턴스를 나누긴 어렵다.
2. 은닉성
2-1. 클래스와 접근한정자
- 클래스에 접근한정자를 지정한 겨우
접근 한정 | 설명 |
public | 객체 생성이 가능하다. 서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능하다. |
private | 클래스에 적용할 수 없다. |
protected | 클래스에 적용할 수 없다. |
default | 동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다. (지금까지의 예제 형태) |
- 클래스의 분리
→ 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적이므로,
기능단위로 소스코드를 분리해야 한다.
→ 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
→ 일반적으로 클래스 정의에는 public 접근한정자만 사용한다.
→ 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다. > 클래스 별로 파일 제작
2-2. 자바빈즈(JavaBeans)
- 자바 언어에서 사용하는 복합적인 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.
- 자바빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법, 행동에 관련된 일련의 관례를 따라야만 한다.
- 지켜야 할 관례
- 클래스는 생성자를 가지고 있어야 한다.
- 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야 한다.
▶ 말이 너무 어렵다. 가장 중요한 것은 자바빈즈가 많은 객체를 단일 객체(빈)로 캡슐화하는 클래스란 점인 것 같다.
2-3. 자바빈즈 사용 이유
- *** 캡슐화 ***
- 접근제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화의 도구이다.
- 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
- 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게 하고 코드를 명확히 함
- 외부에서 멤버를 엑세스 하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전 부가적인 처리를 요구함
- 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함
class Person{
int age;
void howOld();{
System.out.println(age);
}
}
class Main{
public static void main(String[] args){
Person p1 = new Person();
p1.age = -1; // 사람의 나이는 음수가 될 순 없지만 코드 상으론 오류가 아니다.
p1.howOld();
}
}
class Person{
private int age; // private를 사용하여 직접 접근을 막아준다.
public void setAge(int age){ // 데이터에 오류가 있는 것이기 때문에 set으로 받아와 통제한다.
if(age >= 0){
this.age = age;
} else {
this.age = 0;
}
}
void howOld();{
System.out.println(age);
}
}
class Main{
public static void main(String[] args){
Person p1 = new Person();
p1.age = -1; // 사람의 나이는 음수가 될 순 없지만 코드 상으론 오류가 아니다.
p1.howOld();
}
}
- 세터 사용 이유
setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고, 접근 범위에 한해서 메소드로 대입 전 값을 처리 후 대입하게 하기 위해 사용된다.
class Person{
// 오픈
private int age;
private String name;
private String hobby;
// 미오픈
private String gender;
// setter는 작성하나 getter는 작성하지 않음으로써, 값은 기입받아도 값을 알 수 없게 할 수 있다.
public void setGender(String gender){
this.gender = gender;
}
public void setAge(int age){
if(age >= 0){
this.age = age;
} else {
this.age = 0;
}
}
void howOld();{
System.out.println(age);
}
}
class Main{
public static void main(String[] args){
Person p1 = new Person();
p1.age = -1;
p1.howOld();
}
}
- 게터 사용 이유
- 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 다른 사람들도 사용할 필요가 있는
변수들마나 getter를 이용해서 드러낸다.
- 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter
3. 상속성
3-1. 상속 이해하기
- 클래스 간의 상속이란?
→ 클래스 간에는 부모-자식의 상속 관계를 설정할 수 있다.
→ 부모클래스 A를 자식클래스 B가 상속받았을 대, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다.
(단, private으로 설정된 기능은 상속되지 않는다.)
→ B는 A의 public, protected 기능들은 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다.
3-2. 상속 정의 방법
- extends 키워드를 사용하여 부모 클래스의 이름을 명시한다.
public class 자식클래스 extends 부모클래스{...}
3-3. 클래스 다이어그램을 통한 상속의 표현
- 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모 클래스를 가리키는 화살표로 표현한다.
- 클래스 다이어그램에는 상속관계, 클래스이름, 생성자, 메서드 등을 표현한다.
- 상속 관계가 이루어질 때 부모클래스를 super클래스라고 한다.
3-4. 상속의 활용
- 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우
→ CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에, 별도의 소스코딩 없이도 plus() 메서드와 minus()
메서드를 포함하게 된다.
→ CalcChild 클래스에 times()메서드와 divide()메서드를 추가하면 상속받는 메서드에 새로운 기능을 추가하는
효과를 얻을 수 있다.
- 여러 개의 클래스에서 공통되는 기능을 추출하여 공유하기
→ 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와, 자료실의 게시물을 표현하기 위한
FileArticle은 글 번호와 제목이라는 공통된 특성을 갖는다.
→ Article 클래스는 QNAArticle 클래스와 FileArticle 클래스가 공통적으로 포함하고 있는 멤버변수인
"글번호(num)", 제목(title)"과 이 변수들에 대한 getter, setter를 추출한 것이다.
→ 이와 같이 공통 기능을 별도의 클래스로 추출해내면, 코드의 재사용 및 수정이 용이하다.
+ 클래스를 만들 때마다 getter, setter를 무조건 만들고 있어서 왜 그럴까 했는데, 강사님이 일단 만들고 기능을 추가하거나 필요없으면 삭제하는 식으로 나가신다고 하셨다.
'이론 > 자바 풀스택 국비수업' 카테고리의 다른 글
220321 스캐너, 다형성, 객체형변환 (0) | 2022.03.28 |
---|---|
220318 다형성, 오버라이드 (0) | 2022.03.19 |
220315 this2, 클래스·메서드·변수·상수 이름 규칙, 생성자, 은닉성 (0) | 2022.03.17 |
220314 클래스, this1 (0) | 2022.03.14 |
220311 2차원 배열, 메서드 (0) | 2022.03.12 |