챕터 6 클래스로 들어간다.
ㅡ 객체 생성을 위한 클래스 선언
ㅡ 필드 선언하고 생성 후 -> 읽어들이고 변경하는 방법
ㅡ 생성자를 선언하고, 생성자에서 필드를 초기화하기
ㅡ 메소드 기능 이해하기
ㅡ 패키지 선언 방법 알기
ㅡ 접근 제한자의 종류, 사용 방법
객체는 속성과 동작을 가진다.
속성은 "필드", 동작은 "메소드" 라고 한다.
객체를 설계한다고 표현한다. (object modeling)
(현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의)
객체는 독립적이고, 다른 객체와 메소드를 통해 상호작용한다.
>>객체가 다른 객체의 기능을 이용하는 것이 "메소드" 호출하는 것!!
>>객체의 상호작용 = 객체간 메소드 호출. by매개값, 리턴값
리턴값 = 객체명.메소드(매개값1, 매개값2, ...);
+도트 연산자는 어떤 객체의 필드와 메소드에 접근할 때 사용한다.
+메소드 실행 후의 리턴값을 변수에 저장한다
<<객체 간의 관계>>
ㅇ상속 관계 (기계(상위)/ 자동차(하위))
ㅇ사용 관계 (사람/ 자동차)
ㅇ집합 관계 (자동차(완성품)/ 부품)
객체와 클래스
설계도(클래스)를 통해 메모리에서 사용하게 될 객체를 만든다.
설계도인 클래스에는 : 객체 생성을 위한 필드와 메소드가 정의되어 있다.
클래스로부터 만들어진 객체를, 해당 클래스의 인스턴스라고 한다. (과정: 인스턴스화)
(자동차 객체는 자동차 클래스의 인스턴스)
++ 하나의 클래스로부터 여러 인스턴스를 만들 수 있다.
(하나의 설계도로 여러 자동차 만드는 것과 같음)
객체지향 프로그래밍 개발의 세 단계
1. 클래스 설계
2. 설계된 클래스를 가지고 사용할 객체를 생성
3. 생성된 객체 이용
지금까지 공부하면서 아직 딱히 클래스 안에서 객체를 만들어보지는 않았다.
단순히 main() 메소드만 작성해서 프로그램을 실행해왔다.
main()메소드가 없는 클래스는 객체를 생성하여 사용해야 한다.
클래스 선언
사용할 객체를 구상했으면 그를 대표한 클래스 네임을 정한다.
다른 클래스들과 식별할 필요가 있으므로, 이름을 정할 때는 식별자 작성 규칙에 따른다.
(자바키워드 불가, 특문은 $와 _만 가능, 숫자 첫글자 불가능, 하나 이상의 문자로 이루어짐)
통상적으로 각 단어의 첫 글자는 영대문자로 작성한다.
일반적으로 소스 파일 하나당 하나의 클래스를 선언하지만, 2개 이상도 가능하다.
소스 파일을 컴파일하면, 바이트 코드 파일(.class)는 클래스 선언 개수만큼 생긴다.
<<클래스 2개 선언 예시>>
public class Car{
}
class Tire{
}
위 코드를 컴파일하면 Car.class와 Tire.class가 각각 생성된다.
++public 접근 제한자: 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있다. 그렇지 않으면 컴파일 에러가 난다.
가급적이면 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다고 한다.
객체 생성
클래스를 선언하고 컴파일을 마쳤으면, 객체를 생성할 수 있다! (설계도가 마련됨)
"클래스로부터 객체를 생성하는 연산자"는 new연산자이다. new연산자 뒤에는 생성자가 온다.
생성자는 '클래스()' 형태이다.
new 클래스();
이제 객체가 생성되었다. -->이렇게 new연산자로 생성된 객체는 힙영역에 생성된다.
new연산자: 힙 영역에 객체 생성 후, 객체의 번지를 리턴한다. --> 이 번지를 참조타입인 클래스 변수에 저장!! -->변수를 통해 객체를 다룰 수 있다.
<<클래스로 변수선언 / 클래스로부터 객체 생성하여 변수에 객체 번지 넣기>>
클래스 변수;
변수 = new 클래스();
<<클래스 변수 선언과 객체 생성을 1줄로 하기>>
클래스 변수 = new 클래스();
그럼 이제 스택 영역의 변수가, 힙 영역에 생성된 객체를 참조할 수 있다.
<<클래스로부터 객체 생성 해보기 + 변수 선언>>
하나의 패키지에 두 개의 클래스를 만들었다.
클래스 용도
클래스는 두 가지 용도가 있다.
하나는 라이브러리용, 하나는 실행용
(아!! 이거 자료구조 실습할 때 이렇게 두 개의 클래스를 만들었었다. 그게 이거구나!!! >0<!!)
라이브러리((API : Applecation Program Interface)
라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계된다.
++클래스가 100개라면 실행클래스는 단 1개고, 나머지 99개가 다 라이브러리 클래스이다.
실행클래스에는 entry point인 main()메소드가 있다.
++라이브러리 클래스에 main()메소드를 따로 작성해서 "라이브러리+실행" 클래스를 만들 수 있다.
(예제에서는 라이브러리 클래스 중괄호 안에 메인 메소드를 작성했다)
(하지만 대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있다고 한다)
클래스 구성
클래스에는 객체가 가져야 할 구성 멤버가 선언된다. 생략 가능하다. "필드, 생성자, 메소드"
저번에 자료구조 공부하며 실습했던
arraylist 라이브러리 클래스 코드를 잠시 확인해보자.
ㄴ클래스 선언부와, 데이터가 저장되는 필드와, 객체의 동작 부분인 메소드로 이루어짐을 확인할 수 있다.
그리고 아래는 아직 미완성인 linkedlist 라이브러리이다.
여기에는 생성자도 들어가 있다.
ㄴ생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없다.
ㄴ생성자는 new 연산자로 호출할 수 있다. (new 클래스();)
ㄴ객체 생성시 초기화를 담당한다. (위에서는 Node객체 생성과 값 초기화)
ㅇ필드
선언 형태가 변수랑 비슷하지만, 필드는 변수가 아니다.
ㅡ 변수: 생성자와 메소드 내에서만 사용되고, 생성자와 메소드가 실행 종료되면 자동 소멸된다.
(복습: 스택 영역에서 push, pop 된다)
ㅡ 필드: 생성자와 메소드전체에서 사용되며, 객체가 소멸되지 않는 한 객체와 함께 존재한다.
ㄴ객체의 고유 데이터, 상태정보나 부품 객체들을 필드에 저장해둔다.
ㅇ메소드
ㄴ필드를 읽고 수정하는 역할도 하고, 다른 객체를 생성해서 다양한 기능을 하기도 한다.
ㄴ객체 간의 데이터를 전달하는 수단! 객체들의 상호작용!
ㄴ매개값과 리턴값 활용
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/06 06-3 [생성자] [생성자 선언] [생성자 오버로딩] (0) | 2020.07.06 |
---|---|
[혼자 공부하는 자바] 7/06 06-2 [필드] (0) | 2020.07.06 |
[혼자 공부하는 자바] 7/04 05-2 배열2 (0) | 2020.07.04 |
[혼자 공부하는 자바] 7/03 05-2 배열 (0) | 2020.07.03 |
[혼자 공부하는 자바] 7/02 05-1 참조타입 (0) | 2020.07.02 |