Jam's story
16일차 본문
클래스 배열 선언
s는 배열명이다. 배열명[인덱스] 마다 new 연산자를 이용해서 객체를 생성해준다.
Student[] s= new Student[3];은 배열을 생성한것이지 , 객체를 생성한 것이 아님
Student[] s =new Student[3];
s[0]=new Student();
s[1]=new Student();
s[2]=new Student();
Student [] s= {
new Student(),
new Student(),
new Student()
};
Student[] s=new Student[3];
for(int i=0; i<3; i++) {
s[i]=new Student();
}
private 필드에 접근하는 방법 -> getter , setter
getter setter 사용이유
필드를 public 으로 설정했다면 getter setter가 필요가 없다 .
1. 쓰기/읽기 전용의 멤버를 만들고 싶을때
2.유효한 값을 멤버(필드)에 할당하고자 할때
단축키는 Alt+Shift+S
생성자
- 생성자 정의 : 메소드
- 생성자의 역할: 인스턴스 초기화 = 인스턴스 필드 초기화
- 생성자 호출 시기 : 인스턴스 생성될 때 호출한다.
- 생성자는 강제로 호출되는 것이 아니다. 자동으로 호출된다 .
- 리턴값이 없다.
- 생성자의 이름은 클래스 이름과 같아야한다.
- 접근지정자 4가지 사용 가능
- 매개변수가 없는 생성자를 디폴트 생성자라고 한다. 클래스명(){ }
- 생성자는 상속되지 않는다.
- 클래스명(매개변수 ){ 내용 }

기본생성자 Default 생성자
- 매개변수가 없는 생성자
- 컴파일러가 자동적으로 생성해준다.
- 매개변수가 있는 생성자가 있을 시, 자동적으로 추가되지 않기 때문에
- 매개변수가 있는 생성자가 있다면 기본생성자를 생성해줘야 한다.
생성자를 이용한 인스턴스의 복사
인스턴스 변수 상태가 동일한 값의 생성자를 하나 더 만들때,
인스턴스의 복사를 위한 생성자를 만들어준다.
서로 독립적으로 메모리공간에 존재하기 때문에
원래 객체의 값을 바꿔도 복제된 객체의 값이 변하지않는다.
public class Car {
String color;
String gearType;
int door;
public Car() {
this("blue", "s", 12);
}
public Car(Car c) {
this.color=c.color;
this.gearType=c.gearType;
this.door=door;
}
public Car(String color, String gearType, int door) {
super();
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class carTest{
public static void main(String[] args) {
Car c1=new Car();
Car c2=new Car(c1);
System.out.println(c1.color+ c1.gearType+ c1.door);
System.out.println(c2.color+ c2.gearType+ c2.door);
c2.door=342;
System.out.println(c1.color+ c1.gearType+ c1.door);
System.out.println(c2.color+ c2.gearType+ c2.door);
}
}
this
생성자를 호출할 수 있고 멤버를 가리킬 수도 있다.


단독으로 사용될때의 this-> 리턴값, 매개변수
오버로딩- 메소드명 동일, 매개변수 갯수, 타입 달라야한다.
리턴자료형만 다르다고 오버로딩 되지는 않는다.



1)이것은 p2.dispPoint ()와 같다.
2)p1.dispPoint()와 같다. this는 메소드를 호출한 객체 , p2는 매개변수일 뿐이다.

static
- 제어자 modifier
- 사용할 수 있는 곳
- 클래스
- 변수
- 메소드
- 사용할 수 있는 곳 : 멤버변수(필드) , 메소드 , 초기화 블록
static은 왜 클래스이름을 통해서 사용하는지?
- 객체를 생성하기 전에도 이미 클래스당 하나만 생성해서 모든 객체에서 공유하기 때문에
static 메소드를 왜 사용하는지?
- 객체를 생성하기 전에 static 클래스 변수는 메모리 할당되고 클래스명.클래스변수를 사용할 수 있어요
- private 선언되면 접근할 수 없기때문에 static+(public) getter, setter 이용
- 자주 사용하는 메소드는 static 이용, 객체를 생성하지않고 바로 클래스명으로 접근할 수 있기 때문에

변수의 초기화 = 변수를 선언하고 처음으로 값을 저장하는 것
1. 지역변수 = 초기화를 하지 않으면 에러난다. 초기화필수적
2. 인스턴수변수, 클래스변수 = 초기화안해도 각 자료형의 기본값으로 초기화
3. p300 각 타입의 기본값 표
boolean -> false
int, short, byte ->0
float, double -> 0.0f , 0.0
char -> '\u0000'
참조타입 -> null
필드, 초기화방법
- 명시적초기화
- 생성자초기화
- 초기화블럭
초기화 순서
명시적초기화 ->클래스초기화블럭 static{} -> 초기화 블록 ->생성자초기화
static초기화는 객체 생성수에 관계없이 프로그램실행시 1번만 실행된다 .
명시적초기화
클래스의 필드 선언시 값을 할당하는 것을 "명시적 초기화"라고 한다.
String name="미상"; //String은 참조형=>null 로 초기화 된다.
int age=20;
static double rate=0.02;
int count; //명시적초기화X 초기화가 안되어있다. 기본값으로 초기화 되어있음
생성자초기화
public Person() {}
public Person(String name, int age, double rate ) {
this.name = name;
this.age = age;
this.rate=rate;
}
초기화블록

공통적인 부분이 있을 때 ,
{} 안에 초기화를 한다.
위에는 인스턴스초기화
밑에는 static초기화 -> 객체가 몇개가 생성되던지 상관없이 프로그램 시작할때 실행한다 .
{
count++;
serialNo=count;
}
static {
rate=0.07;
}
초기화 순서 알아보는 예제
명시적초기화 ->클래스초기화블럭 static{} -> 초기화 블록 ->생성자초기화


오늘 강사님께 질문한것
여기서 count{} 를 static 클래스초기화로 설정하면
static은 객체생성시마다 실행되지 않고, 프로그램 실행할때 딱1번 실행하기때문에
누적된 값을 구할 수 없다. 그래서 인스턴스 초기화인 {count++;} 로 바꾸어야 한다 (객체 생성시 마다 실행).

이 상황에서 count가 똑같이 나오는 이유는 ?
static을 붙여야한다.
그래야 누적된 값이 나온다 .
public class Ex10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1=new Person("김기태",26,0.05);
System.out.println(p1.name);
System.out.println(p1.age);
System.out.println(p1.rate);
System.out.println("고유번호: "+p1.serialNo);
Person p2=new Person();
System.out.println("고유번호: "+p2.serialNo);
}
}
class Person{
//필드(인스턴스 변수, 클래스 변수 )
//필드를 초기화 하지않으면 각 타입의 기본값으로 초기화 된다 .
//명시적 초기화
String name="미상"; //String은 참조형=>null 로 초기화 된다.
int age=20;
static double rate=0.02;
int count;
int serialNo;
//메소드
//생성자
public Person() {
count++;
serialNo=count;
}
public Person(String name, int age, double rate ) {
count++;
serialNo=count;
this.name = name;
this.age = age;
this.rate=rate;
}
}