- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서
자신의 속성을 가지고 있으면서 식별 가능한 것
- 속성(필드 field)과 동작(메소드 method)으로 구성되어 있음
- 객체 모델링(object modeling) - 객체를 소프트웨어 객체로 설계하는 것
- 객체들은 각각 독립적으로 존재이며 다른 객체와 서로 상호작용하면서 동작함,
객체들 사이의 상호작용 수단은 메소드임
- 객체가 다른 객체의 기능을 이용하는 것 → 메소드 호출
메소드 호출
[표현법] 리턴 값 = 객체.메소드(매개값1, 매개값2, ···)
도토 연산자는 객체의 필드와 메소드에 접근할 때 사용
1) 집합 관계
: 객체는 하나의 부품이고 하나의 완성품에 해당 됨
ex)
자동차는 엔진, 타이어, 핸들 등으로 구성되므로
자동차와 이 부품들은 집합 관계다.
2) 사용 관계
: 객체 간의 상호작용
: 객체는 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄
ex)
사람은 자동차를 사용하므로 사람과 자동차는 사용 관계다.
사람은 자동차를 사용할 때 달린다. 멈춘다. 등
3) 상속 관계
: 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계
: 일반적으로 상위 객체는 종류를 의미, 하위 객체는 구체적인 사물에 해당
ex)
"자동차는 기계의 한 종류이다"에서
기계(상위)와 자동차(하위)는 상속 관계에 있다고 볼 수 있음
- 클래스(class) : 설계도
: 객체를 생성하기 위한 필드와 메소드가 정의되어 있음
- 인스턴스(instance) : 객체
: 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함
: 객체를 만드는 과정을 인스턴스화라고 함
: 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다
→ 동일한 설계도로부터 여러 대의 자동차를 만드는 것과 동일
- main()메소드가 없는 클래스는 객체 생성 과정을 거쳐 사용해야함
클래스이름.java 소스파일 생성
[표현법] public class 클래스이름{ }
- 일반적으로 소스 파일당 하나의 클래스를 선언 하지만
2개 이상 클래스 선언도 가능
- public 접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있음
[표현법 1]
new 클래스();
[표현법 2]
클래스 변수;
변수 = new 클래스();
[표현법 3]
클래스 변수 = new 클래스();
- new는 클래스로부터 객체를 생성시키는 연산자
- new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성됨,
리턴 시 객체의 번지를 리턴함
- 이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용가능
👩💻 클래스 선언 및 클래스로부터 객체 생성
/*
* Student클래스를 선언하고
* StudentExample 클래스의 main()메소드에서 Student객체 생성
*
*/
// Student.java
public class Student {
}
// StudentExample.java
public class StudentExample {
public static void main(String[] args) {
// Student 클래스는 하나지만 new 연산자를 사용한 만큼 객체가 메모리에 생성됨,
// 이러한 객체들은 Student 클래스의 인스턴스임
// 같은 클래스로부터 생성되었지만 각각의 Student객체는
// 자신만의 고유 데이터를 가지면서 메모리에서 활동함
// s1과 s2가 참조하는 Student객체는 완전히 독립된 서도 다른 객체임
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
💻 결과
s1 변수가 Student 객체를 참조합니다.
s2 변수가 또 다른 Student 객체를 참조합니다.
1) 라이브러리(API: Application Program Interface)용 - 다른 클래스에서 이용할 목적으로 설계 됨
2) 실행용 - 프로그램의 실행 진입점인 main()메소드를 제공하는 역할
- 보통 나뉘어서 실행하지만 동시 실행 클래스도 가능
public class Student {
// 라이브러리로서의 코드(필드, 생성자, 메소드)
...
// 실행하기 위한 코드
public static void main(String[] args){
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
- 필드(Field), 생성자(Constructor), 메소드(Method)
public class ClassName {
//필드 - 객체의 데이터가 저장되는 곳
int fieldname;
//생성자 - 객체 생성 시 초기화 역할 담당
ClassName(){ ... }
//메소드 - 객체의 동작에 해당하는 실행 블록
void methodName(){ ... }
}
1) 필드
: 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
: 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지 않는다.
변수
- 생성자와 메소드 내에서만 사용
- 생성자와 메소드가 실행 종료되면 자동 소멸됨
필드
- 생성자와 메소드 전체에서 사용
- 객체가 소멸되지 않는 한 객체와 함께 존재
2) 생성자
: new연산자로 호출되는 특별한 중괄호 {}블록
: 객체 생성 시 초기화를 담당함
: 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 함
: 생성자는 메소드와 비슷하게 생겼지만,
클래스 이름으로 되어 있고 리턴 타입이 없음
3) 메소드
: 객체의 동작에 해당하는 중괄호 {}블록
: 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행됨
: 필드를 읽고 수정하는 역할도 하지만,
다른 객체를 생성해서 다양한 기능을 수행하기도함
: 객체 간의 데이터를 전달하는 수단
: 외부(호출한 곳)로부터 매개 값을 받아 실행에 이용하고,
실행 후 결과 값을 외부(호출한 곳)로 리턴할 수도 있음