자바의 클래스는 다음과 같이 정의를 할 수가 있습니다.
클래스에서 객체를 생성하는 과정을 인스턴스화라고 하며, 생성된 객체를 인스턴스라고 한다!
ex) 붕어빵을 만들기 위해서는 붕어빵 틀이 필요한데, 여기서 붕어빵 틀이 class가 되며, 이 붕어빵틀로 인해 만들어진 붕어빵들을 Object(객체)라고 합니다.
public class fishBread{
private String ingredient = "beans";
public void makeBread(){
System.out.prinln("make fishBean Using "+ingredient);\
}
public static void main(String[] args){
fishBread fish = new fishBread();
fish.makdBread();
}
}
클래스 내부에서 선언된 변수를 의미하며, 위 fishBread클래스에서 선언된 ingredinet를 의미합니다.
이러한 객체변수는 객체를 선언하고, 연산자를 이용해서 접근을 할 수 있습니다.
클래스 내부에 있는 객체 변수에 연산자를 이용해서 접근을 할 수 있으며, 연산자를 이용하여 직접적으로 변수에 접근하는것이 아니라, 메서드를 이용하여 값을 초기화 하고, 값을 가져올 수 있습니다.
public class fishBread {
private String ingredient;
public void setIngredient(String ingredient) {
this.ingredient = ingredient;
}
public String getIngredient() {
return this.ingredient;
}
public static void main(String[] args) {
fishBread fish = new fishBread();
fish.setIngredient("bean");
System.out.println(fish.getIngredient());
}
}
자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할 수 있는 생성자라는 메소드를 제공합니다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method01 {
public static void main(String[] args) {
Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출
System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.
}
}
자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 하지만 자바 컴파일러가 기본 생성자를 기본적으로 제공해 주기 때문에 생성자를 정의하지 않고도 인스턴스를 생성할 수 있습니다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
① Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method04 {
public static void main(String[] args) {
Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출
System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.
}
}
각 멤버변수들의 고유성격을 파악하여 외부에서 접근해야할 바운더리를 성격에 맞게 오픈해주어야 할 때 사용합니다.
클래스 내부에는 클래스 변수와 인스턴스 변수로 나누어집니다.
public class exstaticVar {
public static String testVar = "test";
public static void main(String[] args) {
exstaticVar test1 = new exstaticVar();
exstaticVar test2 = new exstaticVar();
System.out.println(test1.testVar);
test2.testVar = "change test";
System.out.println(test1.testVar);// change test
}
}
public class student {
public int regStudentNum=0;
public static void main(String[] args) {
student 영수 = new student();
student 민수 = new student();
영수.regStudentNum++;
민수.regStudentNum++;
System.out.println(영수.regStudentNum); // 1
}
public class student {
public static int regStudentNum=0; // 등록된 학생수는 객체수가 증가할때마다 늘려야 하기 때문에 static변수로 선언
public String name; // 학생은 각기 고유한 이름을 가지고 있어야 하기 때문에 인스턴스 변수로 선언
public static void main(String[] args) {
student 영수 = new student();
student 민수 = new student();
//영수 객체 선언 후 등록 인원 +1, 이름 지정
영수.regStudentNum++;
영수.name = "박영수";
//민수 객체 선언 후 등록 인원+1, 이름 지정
민수.regStudentNum++;
민수.name = "최민수";
System.out.println(영수.regStudentNum); // 2
System.out.println(영수.name); // 박영수
System.out.println(민수.regStudentNum); // 2
System.out.println(민수.name); // 최민수
}
}
public static int sum(int a, int b) {
return (a + b);
}
public static int multi(int a, int b) {
return (a * b);
}
public static int divide(int a, int b) {
return (a / b);
}
public static void main(String[] args) {
//static 메소드는 객체 생성없이 클래스명.메소드명으로 호출이 가능하다.!!!
System.out.println(calculator.sum(3, 5));
System.out.println(calculator.multi(2, 5));
System.out.println(calculator.divide(20, 5));
}
}
자바는 기본타입의 값을 갖는 객체를 생성할 수 있습니다.
기본타입을 객체타입으로 포장해준다는 말입니다.
포장 객체의 특징은 포장하고 있는 기본 타입은 외부에서 변경할 수 없다는 점입니다.
만약 내부의 값을 변경하고 싶다면 새로운 포장객체를 만들어야 합니다.
기본 타입 | 포장 클래스 |
---|---|
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
포장 객체는 컬렉션 프레임워크에서 기본타입 값을 객체(Arraylist, Map 등등)로 생성해서 관리할 때 사용합니다.
기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 합니다.
기본 타입의 값을 줄 경우 | 문자열을 줄 경우 |
---|---|
Byte obj = new Byte(10); | Byte obj = new Byte("10"); |
Character obj = new Character('가'); | 없음 |
Short obj = new Short(100); | Short obj = new Short("100"); |
Integer obj = new Integer(1000); | Integer obj = new Integer("1000"); |
Long obj = new Long(10000); | Long obj = new Long("10000"); |
Float obj = new Float(2.5F); | Float obj = new Float("2.5F"); |
Double obj = new Double(3.5); | Double obj = new Double("3.5"); |
Boolean obj = new Boolean(true); | Boolean obj = new Boolean("true"); |
생성자를 이용하지 않더라도 다음과 같이 각 포장 클래스마다 가지고 있는 정적 valueOf() 메소드를 사용할 수도 있습니다.
언박싱을 하기 위해서는 기본타입이름+Value() 메소드를 이용해서 메소드를 호출하면 가능합니다.
기본 타입 값을 직접 박싱, 언박싱하지 않아도 자동적으로 박싱과 언박싱이 일어나는 경우가 있습니다.
자동 박싱은 포장 클래스 타입에 기본값이 대입될 경우에 발생합니다.
Integer obj = 100; // 자동박싱
자동 언박싱은 기본 타입에 대해 포장 객체가 대입되는 경우와 연산에서 발생합니다.
Integer obj = new Integer(100);
int value1 = obj; // 자동 언박싱
int value2 = obj + 100; // 자동 언박싱
포장 객체는 내부의 값을 비교하기 위해서 == 와 !=을 사용하면 안됩니다.
이 연산자는 내부의 값을 비교하는 것이 아니라 포장 객체의 참조를 비교하기 때문입니다.
그래서 포장 객체의 비교를 위해서는 언박싱해서 비교하거나, equals() 메소드를 이용해서 내부 값을 비교해야 합니다.