(1)초기값 지정되지 않은 필드
-객체 생성시 자동으로 기본값으로 초기화(0, 0,0, false ,null/char \u0000 <아무것도 없는 문자)
(1) 필드 값을 읽고, 변경하는 작업을 말한다.
(2)필드 사용 위치
-객체 내부: “필드이름” 으로 바로 접근
-객체 외부: “변수.필드이름”으로 접근
--------------------------------------필드 선언 초기값 및 초기화------------------------------
package objectex;
public class Car {
//객체의 고유 데이터, 부품, 객체 ,상태정보를 저장하는 곳 -> 필드
//생성자와 메소드 전체에 사용! 객체가 소멸하지 않는 한 같이 존재.
//객체의 고유 데이터
String company= "현대자동차"; // 하드코딩은 바람직하지 않다!
String model = "그랜저";
int maxSpeed = 300;
//객체의 상태
int productionYear;
int currentSpeed;
boolean engineStart;
}//end class
-----------------------------------필드 사용 -------------------------------
package objectex;
public class CarExample {
public static void main(String[] args) {
Car sonata = new Car();
System.out.println(sonata.model); // 초기화 되어있는 필드
System.out.println(sonata.currentSpeed); //기본값으로 초기화 되어있음
sonata.model = "sonata";//. << 객체 접근 연산자/ 도트 연산자
System.out.println(sonata.model);
Car tussan = new Car();
tussan.model = "tussan";
System.out.println(tussan.model);
} //main
} //class end
(1) new 연사자에 의해 호출되어 객체의 초기화
-필드의 값 설정
-메소드 호출해 객체를 사용할 수 있도록 준비하는 역할 수행
(1)모든 클래스는 생성자가 반드시 존재하며 하나 이상 가질 수 있다.
(2)생성자 선언을 생략하면 컴파일러는 다음과 같은 기본 생성자 추가
------------------------------------기본 생성자 ----------------------------
package objectex;
public class Car2 {
String color;
int cc;
Car2() {
;; //아직 실행문장을 준비하지못했다는 것을 알려주는 문장
// 파이썬(python)에는 pass라는 문자가 있음.
} //기본 생성자 = Default Constructor
//생성자 선언규칙:
//
// [public] 클래스 이름(매개변수선언부){
//
// }
// 매개변수(Parameter)란?
// 공인중개사
// 중개 = 매개
// 매개변수에 주는값 --> 전달인자(Argument)
//Car car =객체 생성;
//Car car = new 생성자();
Car2(String color, int cc){
;;
}// Constructor
Car2 car2 = new Car2("white", 1966);
}//class
(1)디폴트 생성자 대신 개발자가 직접 선언
(2)개발자 선언한 생성자 존재 시 컴파일러는 기본 생성자를 추가하지 않음
-new 연산자로 객체 생성시 개발자가 선언한 생성자 반드시 사용
(1)초기값 없이 선언된 필드는 객체가 생성될 때 기본값으로 자동 설정
(2)다른 값으로 필드 초기화하는 방법
-필드 선언할 때 초기값 설정
-생성자의 매개값으로 초기값 설정
-매개 변수와 필드명 같은 경우 this 사용
-------------------------------------생성자와 참조변수 this----------------------------------------
package objectex;
public class Korean {
// 관례상 -필드 먼저 그리고 생성자
//1. 필드 : (1)고유속성 (2)상태 (3) 부품
String nation = "대한민국";
String name;
String ssn;
//필드 선언부와 생성자 선언은 관례상 2칸 띄어 준다
//식별자를 유의미하게 지어라 그럼 필드하고 이름이 같게 된다.
public Korean(String name, String ssn) {
System.out.println("Korean::constructor invoked.");//new 연산자가 생성자를 호출하면서 이 문구도 출력
System.out.println(this+ " <<-this");//생성된 객체의 변수에서 부른 주소와 this로 찍히는 주소가 같다.
// this키워드 : 클래스 내부에서만 사용가능!!
this.name = name ; // 변수의 의미가 중복일때 품고있는 것 중 가까운 것을 쓴다.
this.ssn= ssn;
//이름충돌을 방지하기위해 this를 사용. 자기자신의 필드를 참조하기 위한 참조변수
} // 생성자 != 기본생성자
} //end class
-------------------------------- new연산자와 생성자 그리고 참조변수들의 객체주소----------------------
package objectex;
public class KoreanExample {
public static void main(String[] args) {
//new: (1)힙에 객체생성 (필드는 기본 타입값으로 초기화)
// (2) 바로 뒤에 나오는 생성자 호출 (필드의 초기화)
// (3) 제대로 초기화까지 끝낸, 힙의 객체의 주소를 반환
Korean k1 = new Korean("유재석" , "720812-1022943"); // 1. 객체 생성
//control 누르고 객체 클릭하면 해다 생성자로 가짐 오호...
// 결국 참조변수와 this는 같은
System.out.println("객체주소:" + k1); //Korean 클래스 내부에서 this랑 같은 주소.
System.out.println("k1.name : "+ k1.name ); // k1.name 호출
System.out.println("k1.ssn : "+ k1.ssn); // k1.ssn 호출
// -----
Korean k2 = new Korean("강호동"/*전달 인자 또는 인자라고함*/ , "700125-1041773");
System.out.println("k1.name : "+ k2.name);
System.out.println("k1.ssn : "+ k2.ssn);
}// main
} // end class
(1)객체 생성할 때 외부 값으로 객체를 초기화할 필요
(2)외부 값이 어떤 타입으로 몇 개가 제공될 지 모름 - 생성자도 다양화
(1)매개변수의 타입, 개수, 순서가 다른 생성자 여러 개 선언
(1)생성자 오버로딩되면 생성자 간의 중복된 코드 발생
(2)초기화 내용이 비슷한 생성자들에서 이러한 현상을 많이 볼 수 있음
-초기화 내용을 한 생성자에 몰아 작성
-다른 생성자는 초기화 내용을 작성한 생성자를 this(…)로 호출
---------------------------------오버라이딩과 this() 생성자---------------------------------
package objectex;
public class OverloadingEx {
//1. 필드
String model;
String color;
int maxSpeed;
// 규칙 매개변수의 (1) 개수 (2) 순서 (3) 타입이 달라야 한다.
OverloadingEx(){ // 매개변수 개수: 0
this(null);
System.out.println("OverloadingEx::default constructor invoked.");
}// Default Constructor
//무수히 많은 생성자를 생성 했을 때 하나의 필드를 교체소요 발생시 다 고치기 힘들다
// 그 때 필요한게 this()이다.
OverloadingEx(String model){
this(model,null); //가장 첫라인에서 생성해줘야한다.
System.out.println("OverloadingEx1::model constructor invoked.");
} // Constructor # 2
OverloadingEx(String model, String color){
this(model,color,0);
System.out.println("OverloadingEx2::model constructor invoked.");
}// Constructor # 3
OverloadingEx(String model, String color, int maxSpeed){
System.out.println("OverloadingEx3::model constructor invoked.");
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}// Constructor # 4
}//end class
-------------------------------------위에 코드 사용 ---------------------------------
package objectex;
public class OverloadingEx2 {
public static void main(String[] args) {
OverloadingEx car1 =new OverloadingEx();
System.out.println("car1.model = " +car1.model);
OverloadingEx car2 =new OverloadingEx("sonata");
System.out.println("car2.model = " +car2.model);
OverloadingEx car3 =new OverloadingEx("Sonata2","yello");
System.out.println("car3.model = " +car3.model);
OverloadingEx car4=new OverloadingEx("Abantte", "black" , 300);
System.out.println("car4.model = " +car4.model);
}
}//end class
(1)객체의 동작(기능)
(2)호출해서 실행할 수 있는 중괄호 { } 블록
(3)메소드 호출하면 중괄호 { } 블록에 있는 모든 코드들이 일괄 실행
(1)리턴타입 메소드이름(매개변수) {메소드 실행블록에 들어갈 코드}
블로그는 쓰면서 한 번 보고 수업 전 한 번 더 보면 아주 좋다.