▶클래스,객체,인스턴스란?
클래스(Class) | 객체(Object) | 인스턴스(Instance) |
-. 객체를 만들어 내기 위한 설계도 혹은 틀 -. 연관되어있는 변수와 메서드의 집합 |
-. 소프트웨어세계에 구현할 대상 -. 클래스에 선언된 모양 그대로 생성된 실체 -. '클래스의 인스턴스(Instance)'라고도 부른다. -. 모든 인스턴스를 대표하는 포괄적인 의미 -. oop(objcet-Oriented Programming) 의 관점에서 클래스의 타입으로 선언 되었을 때 '객체'라고 부른다. |
-. 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실제 -. 즉, 객체를 소프트웨어에 실체화 하면 그것을 '인스턴스'라고부른다. -. 실체화된 인스턴스는 메모리에 할당된다. -. 인스턴스는 객체에 포함된다고 볼 수 있다. -. oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스' 라고 부른다. |
ex) class Animal{ //class의 설계도
...
}
public class Main{
public static void main( String[] args) {
Animal cat, dog; //객체
//인스턴스
cat = new Animal(); //cat과 dog는 Animal 클래스의 인스턴스
dog = new Animal(); //객체를 메모리에 할당
}
}
▶클래스,객체,인스턴스의 차이
클래스 vs 객체 | 객체 vs 인스턴스 |
-. 클래스는 "설계도". 객체는 "설계도로 구현한 모든 대상" 을 의미한다. |
-. 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 부른다. -. 객체는 현실세계에 가깝고, 인스턴스는 소프트웨어세계에 가깝다. -. 객체를 '클래스의 인스턴스'라고도 부른다. -. 엄격하게 객체와 인스턴스를 나누긴 어렵다. |
▶클래스에 접근 한정자를 지정한 경우
-. public: 객체 생성이 가능하며 서로 다른 소스코드에 정의된 클래스끼리도 객체생성이 가능하다.
-. private: 클래스에 적용할 수 없다. private는 클래스에 접근하는 예약어가 아니라는 의미이다.
-. protected: 클래스에 적용할 수 없다.
-. default: 동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다(지금까지의 예제 형태)
▶클래스의 분리
-. 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적 이므로, 기능단위로 소스코드를 분리해야한다.
-. 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
-. 일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.
-. 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.
-. ex)
Main03이 있는 상태에서 새로운 패키지 hiding안에 Main01이라는 새로운 클래스를 만들어 Main03내용을 복사 붙혀넣기를 한다면 Main01에는 StudentJava2라는 해당 class가 생성되지 않았기 때문에 당연히 에러가 발생이 된다.
그래서 StudentJava2라는 클래스파일을 hiding이라는 패키지에 하나 더 만들어 Main03에 있는 StudentJava2 클래스파일 내용을 새로 생성한 StudentJava2 클래스에 그대로 복사한다.
그렇게 hiding이라는 패키지에는 총 2개의 클래스가 만들어졌고 StudentJava2의 오류는 사라진다.
클래스마다 파일을 분리하는 이유는 클래스별로 파일을 생성하는 것이 유지보수에 좋기 때문이다. 이때 유의할점은 클래스는 꼭 public으로 열어두어야한다.
▶자바빈즈(javaBeans)
-. 자바언어에서 사용하는 복합적인 데이터 표현의 최소단위로서, 재사용 가능한 컴포넌트(구성요소)를 생성할 수 있다.
-. 자바빈즈 클래스로서 작동하기 위해서, 객체 클래스는 명명법, 생성법 그리고 행동에 관련된 일련의 관례를 따라야만한다.
-. 지켜야할 관례
-> 클래스는 생성자를 가지고 있어야한다.
-> 클래스 속성들은 getter, setter 메서드들을 사용해 접근할 수 있어야한다.
이런 코드가있다고 가정했을 때 age를 -1로 지정을 하면 나이가 -1이 될 수 없으니 업무적으론 문제가 될 수 있으나 프로그램코드에서는 문제가 없는 것으로 판단하기에 정상출력한다. 위의 Person클래스에서 이를 막아줄 장치가 없기 때문이다.
이를 위해 해당 if코드를 만들어 조건식을 지정을 해서 데이터관리를 해준다.
-. setter는 이렇게 변수의 값의 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고, 접근 범위에 한해서 메소드로 대입전 값을 처리하기위해 사용한다.
-. 변수의 접근을 private로 처리해서 해당 클래스 안에서만 노출되게 바꾸고, 다른 사람들도 오픈될 필요가가 있는 변수들만 getter를 이용해서 드러냈다.
-> 반대로 생각하면 상단의 코드를 고객사에 제출했는데 고객사에서 gender는 오픈하지마라 라는 수정사항이 내려왔다면, setter를 넣어 값을 받아 줄 수는 있지만 값을 내보내주는 getter를 설정하지 않아 코드를 잠궈버릴 수 있다.
-. 이렇게 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것이 getter이다.
▶캡슐화
-. 접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 은닉화를 위한 도구이다.
-> 객체의 필드(속성), 메소드를 하나로 묶고, 실제 구현 내용을 외부에 감추는 것
-. 데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화한다.
-> 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지
않도록 하는데 있다.
-. 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게 하고 코드를 명확히 한다.
-. 외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근 전 부가적인 처리를 요구한다.
-> 자바언어는 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지를 결정하기 위해 접근제한자를
사용한다.
-. 정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 한다.
-> 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 노출해서 제공하는 필드와 메소드만
이용할 수 있다.
▶ 클래스 간의 상속이란?
-. 클래스간에는 부모-자식의 상속 관계를 설정할 수 있다.
-. 부모클래스 A를 자식클래스 B가 상속받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속받게 된다. 단, private로 설정된 기능은 상속되지 않는다.
-.B는 A의 public, protected 기능들은 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수
있게 된다.
▶ 상속 정의 방법
extends 키워드를 사용하여 부모 클래스의 이름을 명시한다.
▶ 클래스 사용 예시
▶ 클래스 다이어그램의 이해
-. 클래스의 구조를 표현하는 클래스 다이어그램에서, 상속은 자식 클래스가 부모 클래스를 가리키는 화살표로 표현한다.
-. 클래스 다이어그램에는 상속관계, 클래스이름, 생성자, 메서드 등을 표현한다.
-. 상속관계가 이루어 질 때 부모클래서를 super 클래스라고 한다.
▶ 상속의 활용
-. 기존에 존재하는 클래스의 소스 수정 없이 기능을 확장하고자 하는 경우
-> CalcChild 클래스는 CalcParent 클래스를 상속받기때문에, 별도의 소스 코딩없이도 plus()메서드와
minus()메서드를 포함하게된다.
-> CalcChild클래스에 times()메서드와 divide()메서드를 추가하면, 상속받는 메서드에 새로운 기능을
추가하는 효과를 얻을 수 있다.
-> CalcParent()만 생성자만 있는 상태에서 고객사에 제출을 했으나 곱셈과 나눗셈이 필요하다고
요청이 온다면 CalcParent()를 수정하고 곱셈과 나눗셈을 추가하는 것 보단 상속을 활용하여
CalcChild라는 자식 클래스를 만들어서 추가를 해주는 것이 좋다.
-. 여러개의 클래스에서 공통되는 기능을 추출하여 공유하기
-> 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle 클래스와 자료실의 게시물을 표현하기
위한 FileArticle은 글 번호와 제목이라는 공통된 특성을 가진다.
위에 QNAArticle과 FileArticle 게시판 2개를 만들려고 하는데 보통 게시판에는 글번호, 글 제목 처럼 게시판에는 꼭 들어가야만할 항목들이 여러가지가 있다. 이 때 상속을 통한 클래스 공통기능을 사용한다.
-. 위 사진처럼 Article 클래스에 QNAArticle 클래스와 FileArticle 클래스가 공통적으로 포함하고 있는 멤버변수인 글번호, 글제목 등만 따로 뽑아 놓은 것이다.
-. 공통기능을 별도의 클래스로 추출해 내면, 코드의 재사용 및 수정이 용이하고 중복된 코드를 넣어 줄 필요가 없어 훨씬 효율적이다.
-. 위의 클래스 다이어그램의 Article 과 QNAArticle을 구현해본 것이다.
Article은 이미 public으로 클래스가 열려있는 상태에서 num과 title의 공통 멤버변수를 포함하는 클래스 파일이 생성되어 있는 상태이다. 상기 코드 2개는 모두 QNAArticle만을 위한 코드이다.
상속을 받으면서 클래스를 분할하여 관리하고 싶다면 자식 클래스는 부모클래스 상속을 받는 파일 하나, 메인함수 파일 하나 총 2개가 필요하다
-. 코드조건 중 노란box "답변을 추가" 부분이 있다. 자식 클래스의 목적은 결국 부모클래스의 기능 혹은 내용을 확장하는 것으로 추가할 것이 있다면 main이 아닌 부모클래스 상속받는 파일에 코드를 작성해준다. 즉, main안에는 주로 출력, 생성자 생성을 주로 하고 부모클래스 상속받는 파일엔 기능 등을 구현하는데 초점을 둔다.
-. 파란박스의 getNum()과 getTitle()은 부모에게서 상속받은 것이고 getAnswer()은 QNAArticle에서 추가로 넣은 기능이 출력된 것이다. 부모에게 getNum()과 getTitle()을 상속받았았음으로 QNAArticle의 class안에 Article class와 동일한 내용이 있다고 생각하면 된다. 그래서 출력을 하는 방법이 일반 메서드 출력과 비교하여 특별함 없이 동일하다.
-. 위의 getNum(),getTitle(),getAnswer()를 모두 syso를 통해 출력을 하려면 번거롭다. 그래서 toString()이라는 메서드를 통해 간편화 시키는 것이 하나의 Tip이다. toString()은 메서드(기능)로 QNAArticle 파일에 넣어주고 Main 메서드에는 syso(qna.toString()); 의 코드로 해당 내용을 출력시킨다.
'국비필기노트 > Java' 카테고리의 다른 글
자바(java)_객체형변환, 객체 배열, instanceof (0) | 2022.03.21 |
---|---|
자바(java)_오버로드(Overload)&오버라이드(Override) (0) | 2022.03.21 |
java_메서드,클래스,생성자 선언 방법 정리 (0) | 2022.03.15 |
자바(java)_생성자,super (0) | 2022.03.15 |
자바(java)_클래스,객체,메서드,전역변수,지역변수 (0) | 2022.03.14 |