설계도
필드(객체를 생성)와 메소드가 정의되어 있음
객체를 정의해 놓은 것
사용자 3명의 시간을 기록하고자 한다.
class NoneClassTime {
public static void main(String[] args) {
// 총 3명 의 시간을 변수로 관리
int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3;
// 총 3명 의 시간을 배열로 관리
int[] hour = new int[3];
int[] minute = new int[3];
int[] second = new int[3];
}
}
시간을 다루는 타입을 직접 만들고 싶다면, 기본형 8개가 아닌 새로운 타입인 시간 클래스를 작성하면 된다.
class Time3_1 {
int hour;
int minute;
int second;
}
class Time3_1Main {
public static void main(String[] args) {
// 총 3명 의 시간을 객체로 관리
Time3_1 t1 = new Time3_1();
Time3_1 t2 = new Time3_1();
Time3_1 t3 = new Time3_1();
// 총 3명 의 시간을 객체 배열로 관리
Time3_1[] timeArr = new Time3_1[3];
timeArr[0] = new Time3_1();
timeArr[1] = new Time3_1();
timeArr[2] = new Time3_1();
}
}
하나의 소스파일에 여러개의 클래스를 정의할 수도 있다.
올바른 사용
// 1
소스 파일 : Hello2.java
클래스 : public class Hello2 {}
클래스 : class Hello3 {}
// 2
소스 파일 : Hello2.java
클래스 : class Hello2 {}
클래스 : class Hello3 {}
잘못된 사용
// 1
소스 파일 : Hello2.java
클래스 : public class Hello2 {}
클래스 : public class Hello3 {}
// 2
소스 파일 : Hello3.java
클래스 : public class Hello2 {}
클래스 : class Hello3 {}
// 3
소스 파일 : hello2.java
클래스 : public class Hello2 {}
클래스 : class Hello3 {}
숫자로 시작 X
언더바( _ ), $ 만 사용 O (다른 특수문자 X)
대소문자 구분 필요
예약어 X
대문자 & 명사 로 시작
두 번째 단어부터는 대문자로 시작하는 것을 권장.
(소문자도 가능은 하다)
package test2;
public class ClassName {
// 필드
int fieldname;
// 생성자
ClassName() {
...
}
// 메소드
void methoName() {
...
}
}
필드(Field)
- 객체의 데이터 저장
- 생성자와 메소드 전체에서 사용됨
- 객체가 소멸되지 않는 한, 객체와 함께 존재 (필드는 변수가 아님!)
생성자(Construction)
- 객체 생성 시, 초기화 담당
- new 연산자로 호출됨
- 클래스 이름과 동일함
- 리턴 타임 없음!
- 모든 클래스에 반드시 1개 이상 존재
메소드(Method)
- 객체의 동작에 해당
- 실행 블록
- 메소드를 호출하면, { } 중괄호 블록 내의 모든 코드들이 일괄적으로 실행됨
- 객체 간 데이터 전달하는 수단: 외부(호출한 곳)로부터 매개값 받아 실행에 이용 --> 실행후, 결과 값을 외부(호출한 곳)로 리턴할수도 있음
하나 이상의 문자: Car, SportsCar
첫글자에 숫자 : 3Car (X)
특수문자 중 $, _ 만 가능 : @Car, #Car (X)
자바 키워드 : int, for (X)
첫 글자는 대문자, 나머지는 소문자
각 단어의 첫 글자는 대문자
// 클래스 이름.java 로 소스파일 생성
public class Car { // Car.class 생성
}
class Tire { // Tire.class 생성
}
소스 파일 이름 = 클래스 이름
public class 는 소문자
{ } 는 클래스 선언의 시작, 끝을 알림
2개 이상의 클래스 선언도 가능
라이브러리 용
실행용
// StudentExample: 클래스 --> 클래스는 1개
public class StudentExample {
/ /main() 메소드를 사용해서, 라이브러리 + 실행 클래스로 만들 수도 있음
public static void main(String[] args) {
// new 연산자를 이용하여, 객체 생성 (이 객체는 Student 클래스의 인스턴스) --> new 연산자로 생성된 객체는 메모리 힙 영역에 생성됨
// Student 클래스는 1개 일지라도, new 연산자를 사용한 만큼 객체가 메모리에 생성됨
// S1과 S2와 s3이 참조하는 Student 객체는 완전히 독립된 서로 다른 객체
// 클래스 변수 선언, 객체 생성을 따로 한 경우
Student s1;
s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
// 클래스 변수 선언, 객체 생성을 1개의 실행문에 한 경우
student s2 = new student();
System.out.println("s2 변수가 다른 Student 객체를 참조합니다.");
Student s3 = new Student();
System.out.println("s3 변수가 또 다른 Student 객체를 참조합니다.");
}
}
상속 이외에 클래스를 재사용하는 방법 中 하나
한 클래스를 작성할 때, 다른 클래스를 멤버 변수로 선언하여 포함시킴
Circle 클래스
class Circle {
inx x;
int y;
int r;
}
Point 클래스
class Point {
int x;
int y;
}
Circle 클래스
class Circle {
Point c = new Point(); // int x 와 int y
int r;
}
Point 클래스
class Point {
int x;
int y;
}
// Calcurator: 객체
// add: 메소드
// 10, 20: 매개값
int result = Calcurator.add(10, 20); //return한 값을 int 변수인 result에 저장
클래스(= 설계도)를 바탕으로 만든 완성품
객체들은 각각 독립적으로 존재 + 다른 객체와 상호작용하면서 동작
→ 객체들 사이의 상호작용 수단? 메소드
→ 객체가 다른 객체의 기능을 이용하는 것? 메소드 호출
실제로 존재하는 것
객체의 구성요소
속성 (= 변수)
행위 (= 메서드)
out 또한 println 메소드를 가지는 객체다.
System.out.println("Hello world!");
객체 모델링
객체 간의 협력 (사람 객체, 자동차 객체가 있을 때)
객체는 메서드를 통해서 데이터를 주고받을 수 있다.
클래스에 필드를 정의해서 선언했다고 해서 바로 사용할 수 있는 것은 X
/* 문법 */
// 1. 클래스의 객체를 참조하기 위한 참조변수(변수명)를 선언
클래스명 변수명;
// 2. 생성된 객체의 주소를 참조변수에 저장
변수명 = new 클래스명;
Car 클래스
public class Car {
// 필드
...
// 기본 생성자
public Car() {
}
// 메소드
...
Main 클래스
public class Main {
public static void main(String[] args) {
// 참조형 변수
Car car1 = new Car(); // Car클래스의 객체인 car1 인스턴스 생성
Car car2 = new Car(); // Car클래스의 객체인 car2 인스턴스 생성
...
}
}
public class Car {
// 필드
...
double speed; // 자동차 속도 , km/h
char gear; // 기어의 상태, P,R,N,D
boolean lights; // 자동차 조명의 상태
// 기본 생성자
public Car() {}
// 메소드
double gasPedal(double kmh) {
speed = kmh;
return speed;
}
char changeGear(char type) {
gear = type;
return gear;
}
...
}
Main 클래스
public class Main {
public static void main(String[] args) {
Car[] carArray = new Car[3]; // 배열 생성
Car car1 = new Car(); // Car 클래스 호출 (car1 인스턴스 생성)
car1.changeGear('P'); // Car 클래스에 선언된 changeGear() 메소드 실행해서, 필드 gear 값을 'P' 로 바꾼다
carArray[0] = car1; // car1 을 생성한 배열에 넣기
Car car2 = new Car(); // car2 인스턴스 생성
car2.changeGear('N');
carArray[1] = car2;
Car car3 = new Car(); // car3 인스턴스 생성
car3.changeGear('D');
carArray[2] = car3;
for (Car car : carArray) {
System.out.println("car.gear = " + car.gear);
}
}
}
/* 출력 결과
car.gear = P
car.gear = N
car.gear = D
*/
class Tv1_1 {
// 속성 : 변수 선언
String color; // 색깔
boolean power = false; // 전원상태 : false 로 초기화
int channel = 1; // 채널 : 1 로 초기화
// 기능 : 메서드 선언
void power() { // 전원 기능
power = !power;
if (power) {
System.out.println("전원 ON");
} else {
System.out.println("전원 OFF");
}
}
void channelUp() { // 채널 증가
channel++;
System.out.println("채널 증가");
}
void channelDown() { // 채널 감소
channel--;
System.out.println("채널 감소");
}
}
class Tv1_1Main {
public static void main(String[] args) {
Tv1_1 t1 = new Tv1_1(); // TV1 인스턴스
t1.color = "검정색"; // 색깔 초기화
Tv1_1 t2 = new Tv1_1(); // TV2 인스턴스
t2.color = "흰색"; // 색깔 초기화
System.out.println("TV1 인스턴스 색깔 = " + t1.color);
System.out.println("TV2 인스턴스 색깔 = " + t2.color);
t1.power(); // 메서드 호출
System.out.println("TV1 인스턴스 채널 = " + t1.channel);
t1.channelUp(); // 메서드 호출
System.out.println("TV1 인스턴스 채널 : " + t1.channel);
t1.channelDown(); // 메서드 호출
System.out.println("TV1 인스턴스 채널 : " + t1.channel);
t1.power(); // 메서드 호출
// TV2 인스턴스 참조변수에 TV1 인스턴스의 주소 저장 했을 때
t2 = t1;
System.out.println("TV1 인스턴스 색깔 = " + t1.color); // 검정색
System.out.println("TV2 인스턴스 색깔 = " + t2.color); // 검정색
// 흰색이었던 TV2 인스턴스 의 색깔이 검정색으로 바뀐건가요?
// 아닙니다.
// 참조변수 t2 에 저장되어있던 TV2 인스턴스 의 주소가 없어지고
// TV1 의 주소가 t2 참조변수에 저장이 됩니다
// 따라서 t2 = t1; 이후 부터는
// t2 참조변수로는 더 이상 TV2 인스턴스 에 접근할 수 없습니다.
}
}
자동차(완성품) - 엔진, 타이어, 핸들(부품)
사람 - 자동차 (사람은 자동차를 사용할 때, 메소드(달린다, 멈춘다 등...)를 사용)
상위(부모) 객체(종류, 기계) - 하위(자식) 객체(구체적인 사물, 자동차)
Tv[] tvArr = new Tv[3] // 객체 배열 생성
tvArr[0] = new Tv(); // 객체 생성 + 배열에 저장
tvArr[1] = new Tv();
tvArr[2] = new Tv();
Tv[] tvArr = {new Tv(), new Tv(), new Tv()}
Tv[] tvArr = new Tv[100]
for (int i = 0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
}
클래스로부터 만들어진 객체
자동차(클래스) -- 자동차(객체): 자동차(객체)는 자동차(클래스)의 인스턴스
인스턴스화
동일한 클래스로 여러 개의 인스턴스를 만들 수 있다
클래스
: ‘객체를 만들기 위한 설계도’
객체
: ‘설계도를 바탕으로 만든 완성품’
인스턴스
클래스의 타입으로 선언되었을 때 '객체'라고 부르고,
그 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
특정 클래스로부터 생성된 객체 (Tv 클래스를 사용해서 만든 Tv인스턴스)
소프트웨어 세계에 가깝다.
‘관계’에 초점을 맞춘다.
객체
‘클래스의 인스턴스’라고도 부른다.
모든 인스턴스를 대표하는 일반적인 용어 (Tv 객체)
현실 세계에 가깝다.
‘실체’에 초점을 맞춘다.
주의!
의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.