클래스는 설계도이고 객체는 제품이다.
우리 일상생활에서 하드웨어로 구성되어 있는 것(tv, 오디오 등)을 소프트웨어(프로그램)으로 바꾸려고 하드웨어를 분석하고 관찰해보니 "속성"과 "기능"으로 표현이 가능하였다. 그래서 한 사물(객체)는 속성과 기능으로 구현이 가능하며 속성은 변수, 기능은 메서드로 정의하여 한 사물(객체)의 클래스를 만들 수 있다.
인스턴스 ≒ 객체
객체: 모든 인스턴스를 대표하는 일반적 용어
인스턴스: 특정 클래스로부터 생성된 객체
클래스로 객체(인스턴스)를 만드는 것을 인스턴스화라고 한다.
클래스(설계도)만 만든다고 제품을 사용할 수 없음.(제품을 의미하는 객체를 생성해야만 사용가능)
하나의 소스파일에는 하나의 public 클래스만 존재해야한다.
소스파일과 같은 이름의 클래스안에 main메서드가 존재해야 한다.
<클래스가 여러개일 때>
(public 클래스가 없을 때)
(public 클래스가 있을 때)
<클래스가 한개일 때>
(public 클래스가 있을 때, 없을 때)
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); //클래스의 객체를 생성한 후(new 클래스명()), 객체의 주소를 참조변수에 저장
(2줄을 1줄로)
클래스명 변수명 = new 클래스명(); (Tv tv = new Tv();)
tv.channel =7; // 변수(속성)를 사용하는 방법
tv.channelDown(); // 메서드(기능)을 사용하는 방법 (메서드 호출이라고도 함)
객체를 사용한다는 말은 객체가 가진 멤버를 사용한다는 말이며 멤버는 변수하고 메서드이다.
new 연산자는 객체를 만들고 그 객체의 주소값을 반환한다. (new 연산자로 만들어지는 객체의 주소값은 같을 수 없다. 사용되고 있는 메모리를 피헤서 빈 자리에 객체를 만들기 때문)
ex) Tv tv = new Tv(); // (new 연산자가 반환한 주소값이 0x100이라고 가정)tv에는 0x100이 저장이 된다.(대입연산자에 의해) 즉, 참조변수에 생성된 객체의 주소값이 저장된다.(대입연산자로 참조변수와 객체를 연결). 참조변수의 타입과 생성하려는 객체의 타입이 같아야한다.(tv(제품)에 맞는 리모컨(참조변수)를 생성)
Tv tv1 = new Tv();
Tv tv2 = new Tv();
tv1.channel = 7;
tv1가 tv2에는 다른 주소 값이 저장된다. 그러므로 tv1.channel = 7로는 tv1이 가지고 있는 주소값에 해당하는 객체만 값이 변한다.
Tv tv1 = new Tv();
Tv tv2 = new Tv();
tv2 = tv1; // (tv2의 값이 0x200이고 tv1의 값이 0x100이라고 가정하면 이 코드로 인해 tv2의 값이 0x100으로 바뀌게 된다.
그러면 tv2와 연결된 객체(객체주소: 0x200)은 tv2리모컨과 연결이 끊어지게 되고 tv1과 연결된 객체(객체 주소: 0x100)는 리모컨이 2개가 된다.(tv1, tv2))
tv2와 연결됬었던 객체(객체주소: 0x200인 객체)는 존재는 하지만 사용할 수 없게 된다.(참조변수(리모컨)가 없기 때문에)
tv1.channel = 7; // tv1.channel값도 7이고 tv2.channel값도 7이된다.
<자바는 Garbage Collector가 존재한다.>
사용할 수 없는 메모리는 Garbage Collector가 메모리를 주기적으로 확인하고 있다가 사용할 수 없는 객체를 찾으면 메모리에서 제거시켜 불필요하게 메모리가 낭비되지 않도록한다.
변수는 하나의 값만 저장가능해서 한 객체에 참조변수가 여러개일순 있지만 참조변수 하나가 여러개의 주소를 가질 수는 없다.(참조변수는 하나의 객체와만 연결 가능)
객체 배열 == 참조변수 배열
(참조변수 배열이지만 참조변수들 안에 객체의 주소가 저장됨, 참조변수 여러개를 묶어서 하나의 배열로 만든 것)
Tv tv1, tv2, tv3 -> Tv[] tvArr = new Tv[3]; // Tv타입의 참조변수 3개 생성, 초기화는 tvArr[0], tvArr[1], tvArr[2]모두 null로 된다.
그리고 tvArr의 값은 new 연산자로 Tv타입의 참조변수를 3개 생성했을 때의 첫번 째 tvArr[0]의 주소 값을 가지게 된다.
tvArr[0] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[0])와 연결시켜줌
tvArr[1] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[2])와 연결시켜줌
tvArr[2] = new Tv(); // Tv객체를 생성하여 참조변수(tvArr[1])와 연결시켜줌
(tvArr[0], tvArr[1], tvArr[2]이 가지고 있는 주소값은 모두 다름)
(위의 코드를 줄여서)
Tv[] tvArr = {new Tv(), new Tv(), new Tv()};