
객체 배열 초기화
***************************중요*********************
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()
};
getter/setter
private로 선언된 필드 x 에 접근하는 방법은? getter/setter
//p1.x = 10;
//p1.x = 10; A -> setX() ->B
질문) getter setter은 어떤 상황에서 주로 사용하나요?
* private를 다른 접근지정자로 바꾸지 않고 get set를 사용하는 이유가 궁금합니다.
*
* 1.이유 : 쓰기 전용/읽기 전용의 멤버를 선언하고자 할때...제어
* 2.이유 : 유효한 값을 멤버(필드)에 할당하고자 할때...
참고) 그렇다면 private 접근지정자는 왜 쓰는 것일까?
1. y 필드 값을 쓰기 가능, 읽기 불가능하게 하고 싶다. 또는 읽기는 가능하고 쓰기는 불가능 하게 하고 싶다.
2. x,y 좌표값의 유효 범위(-100 ~ 100)를 설정하고 싶을 때 사용한다.
생성자
1. 생성자 = 메서드
2. 생성자의 역할 : 인스턴스 초기화 == 인스턴스 변수(필드)를 초기화
3. 생성자 호출 시기 : 인스턴스 생성될 때 호출된다.
생성자는 강제로 호출 X
(즉, new Mypoint()이 코딩이 실행될때 생성자가 호출된다.)
4. 리턴값이 없다. void 키워드 조차 적지 않는다.
5. 생성자 이름 == 클래스 이름(생성자 이름은 반드시 클래스 이름과 같아야한다.)
6. 접근지정자 4가지를 사용할 수 있다.
7. 매개변수가 없는 생성자를 디폴트 생성자(Default Constructor)라고 부른다.
8. 생성자는 오버로딩이 가능.
9.클래스 에 선언된 생성자가 하나도 없는 경우에만
컴파일러가 자동으로 디폴트 생성자를 추가해 준다.
10. 생성자는 상속되지 않는다.
중요**) 클래스에 생성자가 아예 없으면 컴파일러자동으로 디폹트 생성자를 추가해 줘서 오류가 나지 않지만
개발자가 임의로 생성자를 하나 만든 순간
반드시 빈껍데기(디폴트 생성자)를 추가로 만들어줘야한다. 아니면 기존에 있던 파일들에서 오류가 발생할 수 있다.
cf) days15.Tv 들어가서 어떤 경우인지 확인해 봐라
p291 생성자(Constructor)
객체 복사/복제
MyPoint p1 = new MyPoint(10,20);
1. 객체(클래스) 복사(copy)
MyPoint p2 = p1;
p2.setX(100);
System.out.println(p1.getX()); //100
2. 객체(클래스) 복제(clone)
//MyPoint p2 = new MyPoint(p1.getX(),p1.getY());
MyPoint p2 = new MyPoint(p1);
p2.setX(100);
System.out.println(p1.getX()); //10
this 키워드
1.this 키워드(예약어)
2. 정의? 클래스 자기 자신의 주소값을 갖는 참조변수(객체 == p1)
객체(인스턴스) 생성
0x100
3. this의 3가지 용도
ㄱ. 인스턴스(클래스 자기 자신)의 멤버를 가리킬 때의 this
this.y = y;
this.y 멤버변수인 필드를 가리키는 용도
y 생성자의 매개변수 y MyPoint(int x,int y)
ㄴ. 생성자에서 또 다른 생성자를 호출할 때의 this
****ㄷ. 단독으로 사용될 때의 this - [리턴값], [매개변수]상속 수업할 때 설명~
static
정적 변수 == static 변수 == 클래스 변수 ==공유(shared) 변수
정적 메서드 == static 메서드
정적 클래스 == static 클래스(중첩 클래스)
변수 3가지 종류
1) 지역변수
2) 인스턴스 변수
3) 클래스 변수
메서드 2가지 종류
1)인스턴스 메서드
2)정적(static) 메서드
--------------------------------------------------------------------------------
1. 제어자(modifier) - static 키워드
2. 클래스 앞 선언 public static class Test{}
변수 앞 public static int x;
메서드 앞 publiv static void disp{}
3. static 사용할 수 있는 곳 : 멤버변수(필드), 메서드, 초기화 블록 p302
[질문1] static 변수 == 클래스 변수를 왜 선언해서 사용하나요?
Save.rate 필드처럼
공유해서 객체를 생성하기 전에도 클래스 당 하나만 생성해서 모든 객체에서 공유해서 사용하기 위해서.
[질문2] static 메서드 == 정적 메서드를 왜 선언해서 사용하나요?
ㄱ. 객체를 생성하기 전에 static 클래스 변수를 메모리 할당되고 클래스명.클래스 변수를 사용할 수 있어요.
private 선언되었다면 Access할 수가 없다.
그러면 static 클래스 변수를 사용하려면 getter, setter를 사용하고 싶은데 객체가 없어서 사용을 못한다.
그래서
static + getter,setter
클래스명.정적메서드();를 사용한다.
ㄴ. 자주 사용되는 메서드는 static 메서드로 선언한다.(객체 생성해서 사용 X)
클래스명.static메서드();
drawLine() 예시
만약 static이 없다면 메서드를 아래와 같이 사용해야 한다.
Ex09 obj = new Ex09();
obj.drawLine();
원래는 static이 있어도 아래와 같이 써야한다.
클래스명.static메서드명();
Ex09.drawLine();
하지만 같은 클래스 내에서 사용하는 것이기 때문에 클래스명은 생략해도 사용이 가능하다.
drawLine();
변수의 초기화
1. 변수의 초기화?
변수를 선언하고 처음으로 값을 저장(할당) 하는것.
2. 지역변수 - 초기화 x에러(반드시 초기화를 해야지만 사용할 수 있다.)
인스턴스 변수, 클래스 변수 -초기화 X 각 자료형의 기본값으로 초기화.
3. 각 타입의 기본값 표.(자바의 정석 p300)
boolean --> 기본값 false
int,short, byte 0
float, double 0,0f, 0.0
char '\u0000'
참조타입(배열, 클래스, 인터페이스) null
4. 필드(멤버변수) 초기화 방법
ㄱ. 명시적 초기화 : 클래스의 필드 선언 시 값을 할당하는 것을 "명시적 초기화"라고 한다.
ㄴ. 생성자
ㄷ. 초기화 블럭
1) 인스턴스 초기화 블럭: 간단 명료하게 초기화할 목적으로 초기화 블럭을 사용한다.
생성자가 공통적으로 사용하는 코딩을 주로 초기화 할때 사용된다.
어떤 생성자가 사용되든 공통적으로 무조건 사용된다고 생각하면됨)
2) 클래스 초기화 블럭 프로그램 시작시 객체 생성과 상관없이 한번 static{ } 실행.
4-2
일어나는 순서
빠름 느림
명시적 초기화 > 클래스 초기화 블럭 static{ } > 초기화 블럭{ } > 생성자 초기화
ㄴ1번만 실행됨 ㄴ객체가 생성될때마다 초기화블럭{ }과 생성자가 초기화가 실행된다.
멤버 변수(필드)
필드 값을 안줬기 때문에(초기화 하지 않았기 때문에) 각 타입의 기본값으로 초기화 된다.
String name = "미상"; //명시적 초기화
int age = 20; //명시적 초기화
static double rate = 0.02; //명시적 초기화 //클래스 변수(=static 변수)
int count; //명시적 초기화 안되어 있는 상태
int serialNo; //명시적 초기화 안되어 있는 상태
{ //인스턴스 초기화 블럭
count++;
serialNo = count;;
}
static { //클래스 초기화 블럭
rate = 0.07;
}
'Java' 카테고리의 다른 글
[Java] 클래스(5)-다형성__개발공부 18일차-1 (0) | 2022.03.15 |
---|---|
[Java] 클래스(4)-상속__개발공부 17일차 (0) | 2022.03.15 |
[Java] 클래스(2)__개발공부 15일차-1 (0) | 2022.03.11 |
[Java] 클래스(1)__개발공부 14일차-1 (0) | 2022.03.10 |
[Java] 제어문 연습(* 출력)__개발공부 6일차-2 (0) | 2022.03.07 |