이전시간 프리 온빌딩 기간동안에 공부했던 책에서 이어서 공부한다.
그러닉 이 글의 이전글을 읽어보려면 사실상 프리온빌딩 때 썻던 글부터 차례차례 읽어보면 된다.
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지면서 식별 가능한 것을 말한다.
객체는 속성과 동작으로 구성되어 있다.
ex) 속성 : 자동차 // 동작 : 달린다
자바에서는 이 속성과 동작을 각각 필드(field) 와 메소드(method) 라고 한다.
객체를 만들고 이를 조립해 완성된 프로그램을 만드는 기법을 !!!
객체 지향 프로그래밍 이라고 한다.
객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용 하면서 동작한다.
객체들 사이의 상호작용 수단이 바로 메소드 이고, 이 때 객체가 다른 객체의 기능을 이용하는 것이 메소드 호출 이다.
이태까지 흔하게 사용했던 return 을 예로...
리턴값 : 객체, 메소드(매개값1, 매개값2, ... );
자바에서 사용되는 모습은 아래의 사진과 같다.
객체는 개별적으로 사용될 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.
이런한 관계의 종류 에는,상속관계
사용관계
집합관계
가 있다.
ex) 자동차 - 엔진, 타이어, 핸들 로 구성
달린다, 멈춘다
등의 메소드를 호출한다.ex) 기계(상위) - 자동차(하위)
자동차를 만들려면 설계도가 필요하다는 말을 자바로 풀이하면
설계도가 클래스를 말한다고 보면 된다.
클래스에는 객체 생성을 위한 필드와 메소드가 정의되어 있다.
이 클래스로 부터 만들어진 객체를 해당 클래스의 인스턴스(instance) 라고 한다.
ex) 자동차 객체는 자동차 클래스의 인스턴스
클래스로부터 객체를 만다는 과정을 인스턴스화 라고 한다.
위 그림 처럼 하나의 클래스로부터 여러개의 인스턴스를 만드는것이 가능하다 !!
순서로 치면 아래의 순서대로 진행된다고 보면 된다.
객체를 구상하고 나면 이제 그 객체를 의미하는 이름을 짓는다.
이를 클래스 이름으로 정한다.
단, 이 때에는 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙을 따라야 한다.
- 하나 이상의 문자로 이루어져야 한다.
ex)Car
,SprotsCar
- 첫 글자에는 숫자가 올 수 없다.
올바른 예 :Car (O)
잘못된 예 :3Car
'$'
,'_'
외의 특수문자는 사용이 불가능하다.
올바른 예 :%Car
,_Car
잘못된 예 :@Car
,#Car
- 자바 키워드는 사용할 수 없다.
ex)int
,for
만약 단어가 두개 이상 들어가면 각 단어의 첫 글자는 대문자로 작성하는 것이 일반적이다.
ex)ChatClient
,CharServer
,Web_Browser
클래스 이름을 정하고 나면
이제 '클래스 이름.java'
로 소스 파일을 만든다.
소스 파일의 이름 또한 대문자로 구분하므로 반드시 클래스 이름과 대소문자가 같도록 해야 한다.
public class 클래스 이름 {
}
public class
키워드는 클래스를 선언할 때 사용된다.
이 때 사용된 키워드는 반드시 소문자로 작성해야 한다.
클래스 이름 뒤에는 반드시 중괄호{}
를 붙여주는데, 이를 통해 클래스 선언의 시작과 끝을 알 수 있다.
위에서 배운 자동차를 예로 들어서 보자면...
public class Car {
}
class Tire {
}
위 처럼 볼 수 있다. 일반적으로는 소스 파일당 하나의 클래스를 선언하지만 두 개 이상의 클래스 선언도 가능하다.
2개 이상의 클래스가 선언된 소스 파일을 컴파일 하면 바이트 코드 파일(.class)은 클래스를 선언한 개수만큼 만들어진다.
내가 사용중인 인텔리제이를 기준으로 사진상에 보이는 JavaPrac12
와 같은 파일들을 말한다.
즉, 소스 파일(.java)
은 클래스 선언을 담고 있는 저장 단위이지 클래스 자체가 아닌다.
클래스를 선언한 다음, 컴파일을 했다면 객체를 생성할 설계도를 만들었다는 의미이다.
이제 클래스로부터 객체를 생성하려면 new 연산자를 사용하면 된다.new 클래스();
객체를 생성시키는 연사자를 말한다.
new 연산자 뒤에 오는 생성자가클래스() 형태
를 가지고 있다.
new 연산자로 생성된 객체는메모리 힙(heap)
영역에 생성된다.
메모리 내에서 생성된 객체의 위치를 알아야 사용이 가능하다.
즉, new 연산자를 통해 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴 하도록 한다.
이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체의 사용이 가능하다.
클래스로 선언된 변수에 new 연산자가 리턴한 객체의 번지를 저장하는 방법
클래스 변수;
변수 = new 클래스();
클래스 변수 선언과 객체 생성을 한 개의 실행문으로 작성하기
클래스 변수 = new 클래스();
new 연산자로 객체를 생성하고 리턴된 객체의 번지를 변수에 저장하면 위의 그림과 같이 변수가 객체를 참조하게 된다.
StudentExample
를 실행하면 메모리에 클래스 변수와 객체가 생성된다.
Student 클래스
는 하나지만, new 연산자
를 사용한 만큼 객체가 메모리에 생성된다.
이러한 객체들을 Student 클래스의 인스턴스 라고 한다.
여기서 s1 과 s2 가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체이다.
실행해본 결과 ↑↑↑
클래스는 두 가지 용도가 있다.
라이브러리
와 다른 하나는실행용
이다.1. 라이브러리 클래스
다른 클래스에서 이용할 목적으로 설계
2. 실행용
프로그램 전체에 사용되는 클래스가50
개 라면49
개는 라이브러리 클래스이고 단 하나가실행용
클래스 이다.실행 클래스는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할을 한다.
위에서 예시로 만든 Student
와 StudentExample
을 예시로 설명하자면
라이브러리 클래스 - Student
실행용 클래스 - StudentExample
위 처럼 볼 수 있다. 하지만 아래의 예시처럼 하면 Student
에 main() 메소드를 작성해서 라이브러리인 동시에 실행 클래스로 만들 수도 있다.
프로그램이 단 하나의 클래스로 구성된다면 위와 같이 작성하는 것이 좋을 수 있지만,
대부분의 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있다.
따라서 상황에 맞게 적절하게 사용해주는 것이 좋다.
클래스에는 객체가 가져야 할 구성 멤버가 선언된다.
구성 멤버에는필드(Field)
,생성자(Constructor)
,메소드(Method)
가 있다.
이 구성 멤버들은 생략되거나 복수의 개수로 만들 수 있다.
객체의
고유 데이터
,부품 객체
,상태 정보
를 저장하는 곳이다.
선언 형태는 변수(variable) 와 비슷 하지만 필드를 변수라고 부르지는 않는다.
필드는 변수와 다르게 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
new 연산자로 호출되는 특별한 중괄호
{}
블록 이다.
생성자의 역할은 객체 생성시 초기화를 담당한다.
필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
클래스 이름으로 되어 있고 리턴 타입이 없다.
객체의 동작에 해당하는 중괄호
{}
블록을 말한다.
중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름이다.
즉, 어떠한 특정 작업을 수행하기 위한 명령문의 집합장점으로 말하면, 메소드를 작성하여 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있다.
클래스 : 객체를 만들기 위한 설계도
객체 : 클래스로부터 생성되면new 클래스()
로 생성한다.
new 연산자 : 객체 생성 연산자이며, 생성자를 호출하고 객체 생성 번지를 리턴합니다.
클래스 변수 : 클래스로 선언한 변수를 말하며 해당 클래스의 객체 번지가 저장됩니다.
인스턴스 : 객체는 클래스의 인스턴스 입니다.
클래스 멤버 : 클래스에 선언되는 멤버는 필드, 생성자, 메소드가 있다.