클래스 선언
public class 클래스명{
필드(전역변수)
/* 여기 아래의 int는 기본타입*/
[고유 데이터]
// 제작회사(현대, 삼성, 기아)
String company;
// 모델(SONATA, K5, SM)
String model;
// 색상(WHITE, BLACK, GRAY)
String color;
// 최고 속도(200)
int maxSpeed;
[상태 데이터]
// 현재 속도(60)
int speed;
// 엔진 회전 수(1200RPM)
int rpm;
/* 여기 아래의 Body, Engine, Tire는 참조타입*/
// 초기값을 지정하지 않으면 객체 생성시 자동으로 기본 초기값으로 설정된다.
// (참조타입의 초기값은 null)
[부품]
Body body;
//엔진
Engine engine = "A급";
//타이어
Tire tire;
생성자
메소드
}
클래스 선언 -> 객체생성
public static void main(String[] args){
클래스타입(참조타입) 참조변수 = new 클래스명()
}
객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.
필드 선언은 클래스 중괄호 {}블록 어디서든 존재할 수 있습니다.
생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다.
하지만 생성자와 메소드 중괄호{} 블록 내부에서는 선언이 될 수 없다.
필드를 사용한다는 것은 필드값을 읽고 변경하는 작업을 말한다.
// a 변수에 저장된 값 가져오기
System.out.println(a);
// a 변수에 저장된 값 변경하기(10 -> 20)
a=20;
파일명 Car
public class Car { //Car클래스 선언
/* 필드 시작 */
// 제조회사
String company = "현대자동차";
//모델
String model = "그랜저";
// 차량의 색상
String color = "검정";
// 최대속도값
int maxSpeed = 350;
// 현재 속도값
int speed; //초기값이 없는 필드
}
파일명 CarExample
public class CarExample {
public static void main(String[] args) {
// int a = 10
Car myCar = new Car();
// new - 새로운 객체 생성, Car클래스에서 생성된 새로운 주소 (new)를 mycar (참조)변수에 저장
// Car 클래스에 있는 필드값 가져오기
System.out.println("제작회사 : " + myCar.company);
System.out.println("모델명 : " + myCar.model);
System.out.println("색깔 : " + myCar.color);
System.out.println("최고속드 : " + myCar.maxSpeed);
System.out.println("현재속도 : " + myCar.speed);
// Car클래스에 있는 필드값 변경하기
myCar.speed = 60;
System.out.println("수정된 속도 : " + myCar.speed);
}
}
public class FieldInitValueExample {
public static void main(String[] args) {
FieldInitValue fiv = new FieldInitValue();
System.out.println("byteField: " + fiv.byteField);
System.out.println("shortField: " + fiv.shortField);
System.out.println("intField: " + fiv.intField);
System.out.println("longField: " + fiv.longField);
System.out.println("booleanField: " + fiv.booleanField);
System.out.println("charField: " + fiv.charField);
System.out.println("floatField: " + fiv.floatField);
System.out.println("doubleField: " + fiv.doubleField);
System.out.println("arrField: " + fiv.arrField);
System.out.println("referenceField: " + fiv.referenceField);
}
}
public class FieldInitValue {
//필드
byte byteField; // 타입이 byte면 기본값은 0
short shortField; // 타입이 short면 기본값은 0
int intField; // 타입이 int면 기본값은 0
long longField; // 타입이 long면 기본값은 0
boolean booleanField; // 타입이 boolean면 기본값은 false
char charField; // 타입이 char면 기본값은 빈칸
float floatField; // 타입이 float면 기본값은 0.0
double doubleField; // 타입이 double면 기본값은 0.0
int[] arrField; // 타입이 배열타입이면 기본값은 null
String referenceField; // 타입이 참조타입이면 기본값은 null
}
생성자(Constructor)는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당함
객체 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말합니다.
생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없습니다.
new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체의 번지가 리턴됩니다.
모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있습니다. 우리가 클래스 내부에 생성자 선언을 생략했다면
컴파일러는 다음과 같이 중괄호{} 블록 내용이 비어 있는 기본 생성자(Default Construcor)를 바이트코드에 자동 추가합니다.
속성
[public] 클래스(){ }
- 클래스가 public class로 선언하면 기본 생성자에도 public 이 붙지만,
클래스가 public 없이 선언되면 기본 생성자에도 public이 붙지 않습니다.
소스파일 (Car.java)
public class Car{
}
↓ 컴파일
바이트 코드 파일(Car.class)
public class Car{
public Car(){ }
}
기본 생성자 대신 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성하면 됩니다.
클래스{ 매개변수선언(parameter), ''') {
//객체의 초기화 코드
}
클래스로부터 객체가 생성될 때 기본 초기값으로 자동 설정됩니다.
만약 다른 값으로 초기화 하고 싶다면 두 가지 방법이 있습니다.
1. 필드를 선언할 때 초기값을 주는 방법
2. 생성자에게 초기값을 주는 방법
예제)
파일명 : Korean
-----------------------------------------------------------------------
public class Korean {
//필드
String nation = "대한민국"; // 대한민국으로 nation 필드에 초기화
// 초기화(x) -> 매개변수가 있는 생성자의 의해서 "박자바"라는 문자열이 name 필드에 초기화
String name;
// 초기화(x) -> 매개변수가 있는 생성자의 의해서 "011225-1234567"라는 문자열이 ssn 필드에 초기화
String ssn;
// 자동 추가 : 아래쪽에 매개변수가 있는 생성자에 의해서 자동 추가된 기본생성자는 없어짐.
// 자동 추가된 기본생성자는 없어짐.
// Korean()
// 생성자(매개변수가 있는 생성자)
Korean(String n, String s){
name = n;
ssn = s;
}
}
-----------------------------------------------------------------------
파일명 : KoreanExample
public class KoreanExample {
public static void main(String[] args) {
// Korean 클래스 객체 생성
Korean k1 = new Korean("박자바", "011225-1234567"); // 기본생성자 호출함과 동시에 Korean.java에 기본값이 들어감
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korean k2 = new Korean("김자바", "930525-0654321");
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
-----------------------------------------------------------------------
자바에서는 인스턴스 자신을 가리키는 키워드
이 단어는 클래스 안에서 볼 수 있는데 클래스 메소드의 매개변수와 멤버변수의 식별자(변수이름)이 겹치는 경우가 발생할 때 유용하게 사용합니다.
// 메서드 선언
// 정수 + 정수
int add1(int a, int b){
int result = a + b;
return result; // 리턴하면 메서드 호출부로감
}
// 정수 + 실수
double add2(int a, double b){
double result = a + b;
return result;
}
// 실수 + 정수
double add3(double a, int b){
double result = a + b;
return result;
}
// 실수 + 실수
doublea add4(double a, double b){
double result = a + b;
return result;
}
// 메서드 호출
add1(1, 2);
add2(1, 2.5);
add3(1.5, 2);
add4(1.5, 2.5);
-> 메서드 오버로딩 ->
// 메서드 선언
// 정수 + 정수
int add(int a, int b){
int result = a + b;
return result; // 리턴하면 메서드 호출부로감
}
// 정수 + 실수
double add(int a, double b){
double result = a + b;
return result;
}
// 실수 + 정수
double add(double a, int b){
double result = a + b;
return result;
}
// 실수 + 실수
doublea add(double a, double b){
double result = a + b;
return result;
}
자바스크립트는 타입이 없어서 하나로 처리가능하지만 자바는 타입이 존재하기 때문에 실제 변수타입과 일치하지 않으면
실행이 안되기 때문에 메서드 오버로딩을 통해 처리해줘야함.
생성자 오버로딩을 하려면
오버로딩에 메서드이름이 같다.
매개변수의 타입이 다르다 or 매개변수의 갯수가 다르다.
this() 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다.
생성자 오버로딩이 많아질 경우 생성자 간의 코드가 중복된 코드가 발생할 수 있습니다.
매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상을 많이 볼 수 있습니다.
필드 초기화 내용은 한 생성자에 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로
개선할 수 있습니다.
생성자(){
this(공통 실행 코드에서 parameter로 쓸 값1, parameter로 쓸 값2, parameter로 쓸 값3)
}
끝.