인스턴스(객체)는 참조변수(t)를 통해서만 다룰 수 있으며 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
참조변수에는 하나의 값(주소)만 저장될수 있다.
하나의 인스턴스를 두개의 참조변수가 가리키는 것은 가능하지만
하나의 참조변수가 두개의 인스턴스를 가리킬 수는 없다.
public class TvTest { public static void main(String[] args) { Tv t; //Tv인스턴스를 참조하기 위한 변수 t 선언 t = new Tv(); //Tv인스턴스 생성 t.channel = 7; //Tv인스턴스의 멤버변수 channel 에 7저장 t.channelDown(); //Tv인스턴스의 channelDown() 호출 System.out.println("현재 채널은 " + t.channel + " 입니다."); } }
class Tv { String Color; boolean power; int channel;
-> nameArray에 들어있는 각 원소에 대해, 원소를 name 변수에 저장하고 순환문 코드를 실행시킨다.
-> name이라는 String변수를 만들고 그 값을 null로 한다.
-> nameArray의 첫 번째 값을 name에 대입한다.
-> 순환문 코드를 실행한다.
-> nameArray의 다음 값을 name에 대입한다.
-> 배열에 원소가 남아있으면 위 작업을 반복한다.
배열
배열의 선언
*역참조변수로 선언된다.
1) 타입[] 변수이름
int [] score;
String[] name;
2) 타입 변수이름[]
int score[];
string name[];
배열의 생성
new 연산자를 이용하여 배열의 타입과 크기를 지정해 주어야 한다.
int [] score; //선언
score = new int[5]; //생성
>>int [] score = new int[5]; //한줄로 줄일수 있다.
* 배열도 객체 : 멤버변수와 메소드를 갖고 있다.
멤버변수 length : 배열의 크기값을 반환한다.
배열은 한번 생성되면 중간에 그 크기를 변경할 수 없다.
생성이 이루어지고 나서야 저장공간이 생긴다.
각 배열요소는 자동적으로 int의 기본값인 0으로 초기화 된다.
대입연산자(=)로 배열의 주소를 배열 역참조변수 score에 저장한다.
변수 타입에 따른 기본값
* 기본형 변수는 거짓, 0 ,
참조형 변수는 NULL 값을 갖는다.
배열의 초기화
- 기본값으로 초기화 되지만 원하는 값으로 초기화 하기 위해.
- 각 요소마다 초기화 하는 방법도 있지만 좀더 편하게 할수 있다.
int[] score = { 100. 90. 80. 70. 60 };
int[] score = new int[] { 100, 90, 80, 70, 60 };
배열의 크기는 따로 지정하지 않으면 주어진 값의 개수만큼 결정된다.
public class ArrayEx1 { public static void main(String[] args) { int sum = 0; //변수 선언과 초기화 float average = 0f;
int [] score = {100, 88, 100, 100, 90}; //배열의 선언, 생성과 초기화 for(int i=0; i<score.length; i++) { //for문을 이용하여 각 요소의 값들을 연산한다. sum += score[i]; //덧셈 누적 연산 } average = sum/(float) score.length; System.out.println("총점: " + sum); System.out.println("평균: " + average); }
}
배열의 복사
배열은 한번 생성하면 크기를 변경할 수 없기 때문에 저장공간이 더 필요하다면
더 큰 배열을 만들어 내용을 복사해야 한다.
public class ArrayEx8 { public static void main(String[] args) { int [] number = { 0, 1, 2, 3, 4, 5 }; //길이가 6인 배열 int [] newNumber = new int[10]; //길이가 10인 배열
for(int i=0; i<number.length; i++) { newNumber[i] = number[i]; //number의 각 요소의 값을 새로운 배열에 복사한다. } for(int i=0; i<newNumber.length; i++) { System.out.print(newNumber[i]); } }
}
- 결과 : 0123450000
새로운 배열은 0으로 초기화되어 있다.
arraycopy 메소드
- 간단하게 배열을 복사할 수 있다.
- 배열에 있는 값만 복사하기 때문에 참조변수 배열인 경우
주소값만 복사할 뿐 참조변수가 가리키는 객체를 복사하지는 않는다.
public class ArrayEx9 { public static void main(String[] args) { char [] abc = {'A', 'B', 'C', 'D' }; //배열 선언, 생성, 초기화 char [] number = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
System.out.println(new String(abc)); System.out.println(new String(number)); //각 배열 출력
char [] result = new char[abc.length + number.length]; //두 배열길이를 더한 만큼의 길이를 가진 새로운 배열 생성
상위 클래스유형을 메소드의 인자, 리턴유형, 배열유형으로 쓸수 있게 하는 것이 다형성이다.
상위클래스 유형에 속하는 하위클래스 유형에는 모든 상위 클래스의 메소드가 있어야 한다.(상속)
- 한 타입의 참조변수로 여러 타입의 객체를 참조 할 수 있도록 함.
참조변수의 형변환
- 캐스트연산자를 사용하여 상속관계에 있는 클래스 타입의 참조변수간 형변환을 자유롭게 수행할수 있다.
- 참조변수가 참조하는 인스턴스의 타입보다 자손타입으로의 형변환은 불가한다.
public class CastingTest1 { public static void main(String[] atgs) { Car car = null; FireEngine fe = new FireEngine(); //FireEngine타입참조변수 fe FireEngine fe2 = null;
fe.water(); car = fe; //car=(car)fe; 형변환 생략 fe가 참조하는 인스턴스를 car이 참조하도록 한다 // car.water(); //Car 타입의 참조변수로 water()를 호출할수 없다.
class Car { String color; int door; void drive() { System.out.println("drive, Brrrr~"); }
void stop() { System.out.println("stop!!!"); } }
class FireEngine extends Car { void water() { System.out.println("water!!!"); } }
instenceof 연산자
- 참조변수가 참조하고 있는 인스턴수의 실제 타입을 알아보기 위해 사용된다.
- 조건문에서 사용되며 true, false를 결과값으로 한다.
- 결과값이 참일때 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
public class InstenceofTest { public static void main(String[] args) { FireEngine fe = new FireEngine();
if(fe instanceof FireEngine) { System.out.println("This is a FireEngine instance."); } if(fe instanceof Car) { System.out.println("This is a Car instance."); } if(fe instanceof Object) { System.out.println("This is a Object instance."); } } }