클래스: 객체의 설계도
객체: 실제로 존재하는 것
인스턴스: 클래스로부터 만들어진 객체
객체와 인스턴스의 차이는?
Tv t; //Tv클래스 타입의 참조변수 t(리모콘)를 선언.
t = new Tv(); //Tv인스턴스를 생성한 후 생성된 인스턴스의 주소를 t에 저장
(Tv t = new Tv()과 동일)
에서 t은 객체이자 Tv의 인스턴스
new연산자는 객체를 생성하고 그 객체의 주소를 반환한다. 즉 그 객체의 주소가 참조변수 t에 대입된다.
인스턴스는 특정 객체가 어떤 클래스의 객체인지 "관계위주"로 설명할 때 사용됨.
즉 t는 객체, t는 Tv의 인스턴스 라고 표현할 수 있음.
속성(변수) + 기능(메서드)
Tv t1,t2,t3과 같이 여러가지 객체를 다뤄야할 때 객체 배열을 생성해서 다룰 수 있다.
Tv[] tvArr = new Tv[3]; //길이가 3인 Tv타입의 참조변수 배열
이 때 객체를 다루기 위한 참조변수만 만들어졌을 뿐 객체가 저장되지 않았다.
이후 객체를 생성하여 각 요소에 저장한다.
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
위의 네 줄을 아래와 같이 한 줄로 간단히 할 수도 있다.
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};
다룰 객체가 많으면 for문을 사용해도 된다.
Tv[] tvArr = new Tv[100];
for(int i = 0; i<tvArr.length; i++){
tvArr[i]=new Tv();
}
클래스 - 사용자 정의타입(원하는 타입을 직접 만들 수 있다.)
필드: 객체의 데이터가 저장되는 곳
생성자와 메소드 전체에서 사용됨
생성자: new 연산자로 호출되는 중괄호 블록
객체 생성 시 초기화 역할 담당
메소드와 비슷하지만 클래스 이름으로 되어있고 리턴 타입이 없음
메소드: 객체의 동작에 해당하는 중괄호 블록
Animal이라는 클래스를 정의함
클래스에 name이라는 String변수(속성,인스턴스 변수) 추가
Animal 클래스의 인스턴스인 cat이 만들어짐
객체.객체변수(cat.name)의 형식으로 객체 사용
class Car{
//필드
String company = "테슬라";
String model = "모델X";
String color = "화이트";
int maxSpeed = 350;
int speed;
}
public class CarExample {
public static void main(String[] args) {
Car mycar = new Car(); //객체생성
//필드값 읽기
System.out.println("회사: " + mycar.company);
System.out.println("모델명: " + mycar.model);
System.out.println("색상: " + mycar.color);
System.out.println("현재속도: " + mycar.speed);
System.out.println("최고속도: " + mycar.maxSpeed);
//필드값 변경
mycar.speed = 60;
System.out.println("진짜 현재속도: " + mycar.speed);
}
}
class Tv {
//Tv의 속성(인스턴스 변수)
String color;
boolean power;
int channel;
//Tv의 기능(메서드)
void power() {
power = !power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
}
class TvExample {
public static void main(String[] args) {
Tv t = new Tv();
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은 " + t.channel);
}
}
class InitTest{
int x;
int y = x; //인스턴스 변수
void method(){
int i;
int j = i//에러,초기화하지않음
}
}
class Card{
String kind;
int number;
static int width = 100;
static int height = 250;
}
public class CardExample {
public static void main(String[] args) {
System.out.println("Card.width: " + Card.width);
System.out.println("Card.hegith: " + Card.height);
Card c1 = new Card();
c1.kind = "Heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.println("c1: " + c1.kind + "," + c1.number + "이고 크기는 (" + c1.width + "," + c1.height + ")");
System.out.println("c2: " + c2.kind + "," + c2.number + "이고 크기는 (" + c2.width + "," + c2.height + ")");
System.out.println("width, height 변경");
c1.width = 50; //Card.width로 사용권장(cv)
c1.height = 80; //Card.height로 사용권장
System.out.println("c1: " + c1.kind + "," + c1.number + "이고 크기는 (" + c1.width + "," + c1.height + ")");
System.out.println("c2: " + c2.kind + "," + c2.number + "이고 크기는 (" + c2.width + "," + c2.height + ")");
}
}