class Phone {
String model;
String color;
int price;
} // phone이라는 클래스를 정의. phone은 model color price의 속성(멤버변수)을 가짐.
public class Main {
public static void main(String[] args) {
Phone galaxy = new Phone(); // phone 클래스에 해당하는 "galaxy" 이름 가진 객체 생성
galaxy.model = "Galaxy10";
galaxy.color = "Black";
galaxy.price = 100;
Phone iphone =new Phone(); //phone 클래스에 해당하는 iphone이란 이름을 가진 객체 생성
iphone.model = "iPhoneX";
iphone.color = "Black";
iphone.price = 200;
System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
}
}
새로운 인스턴스 만들 시 클래스 새인스턴스명 = new 클래스();
로 선언.
새인스턴스명.멤버변수 = 멤버값;
으로 멤버변수 할당
새인스턴스명.멤버변수
를 그냥 쓰면 거기 할당 된 값을 불러옴.
메소드(Method) : 어떤 작업을 수행하는 코드를 하나로 묶어놓은 것. 함수와 비슷
메소드가 필요한 이유
int[] heights = new int[5];
initHeight(heights);
sortHeight(heights);
printHeight(heights);
메소드를 만들 때 이름을 잘 지으면 메소드 안을 안살펴봐도 한눈에 볼 수 있어 좋다. 이를 readability표현이 좋다고 한다. 메소드는 동사로 시작해야되고 camelCase로 작성해야함!!
int add(int x, int y) {
int result = x + y;
return result;
}
여기서 맨 처음 int는 메소드의 결과값이 전달되는 타입. return type
메소드(add) 이름 뒤에 괄호치고 나오는 int x와 int y 는 parameter
파라미터는 원하는 만큼 쓸 수 있다.
class Calculation {
int add(int x, int y) {
int result = x + y;
return result;
}// 두 값을 더한 결과
int subtract(int x, int y) {
return x - y;
}// 두 값을 뺀 결과
}
public class Main {
public static void main(String[] args) {
Calculation calculation = new Calculation();
int addResult = calculation.add(100, 90);
int subResult = calculation.subtract(90, 70);
System.out.println("두 개를 더한 값은 " + addResult);
System.out.println("두 개를 뺀 값은 " + subResult);
}
}
생성자 : 인스턴스가 생성될 때 사용되는 '인스턴스 초기화 메소드'. 클래스에 구현.
new
와 같은 키워드로 해당 클래스의 인스턴스가 새로 생성될 때, 자동으로 호출되는 메소드다.
대표적으로 인스턴스 변수를 초기화 하는 용도로 사용한다.
생성자의 형식
클래스이름 (타입 변수명, 타입 변수명, ...){
인스턴스 생성 될 때에 수행하여할 코드
변수의 초기화 코드
}
생성자의 조건 : return값이 없다. 생성자의 이름은 class명과 같아야한다.
모든 클래스에는 하나이상의 생성자가 반드시 있어야한다!(없으면 컴파일러가 기본생성자 알아서 만들어주긴함)
예시
class Phone {
String model;
String color;
int price;
//아래가 생성자. 생성자에서 사용된 this는 생성된 객체 자신.
Phone(String model, String color, int price) { //생성자 이름은 클래스명과 동일
this.model = model; //첫번째 model이 위에꺼. 두번째 model이 생성자에꺼.
this.color = color;
this.price = price;
}
}
public class Main {
public static void main(String[] args) {
Phone galaxy = new Phone("Galaxy10", "Black", 100);
// 생성자 만들었으면 괄호()안에 새인스턴스의 멤버변수 넣으면 됨.
Phone iphone =new Phone("iPhoneX", "Black", 200);
// 위에 예시에서 길었던 코드들이 생성자 덕에 1줄로 간결해짐.
System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
}
}
this는 생성된 객체 자신. super는 내가 상속받은 부모의 클래스
윈도우 기준 alt+insert 누르면 constructor 클릭하고 shift+클릭으로 메인변수 다 지정하면 빠르고 간편하게 생성자 구축 완료.
class의 변수는 생성자를 통해 초기화를 하지 않는다면 기본값을 가진다.
정수는 0, 실수는 0.0, boolean은 false, String은 null(아무런 값이 없는 상태)
byte는 0(숫자 0이 아니라 8비트가 모두 false기때문에)
위의 car를 부모 class. 아래의 suv sedan이 자식(child) class
상속을 통해 기존의 클래스를 재사용할 수 있다. 클래스간 계층구조가 생긴다.
상속의 특징
extends
를 통해 상속받는다class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
Animal이 부모. 그 밑에 dog cat이 자식 class
상속받을때 여러 클래스를 받을 수는 없다. 오직 하나의 class만 상속받을 수 있다.
자식 객체는 자식 타입 변수에도 할당할 수 있고, 부모 타입 변수에도 할당할 수 있다.
하지만 부모 타입 변수로 사용할 때는 자식 타입의 메소드(함수)는 쓸 수 없다.
오버로딩(Overloading) : 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
조건 : 메소드 이름이 동일. 매개변수의 개수 or 타입(int long String 등)이 달라야한다.
(단, return type이 다른걸로는 오버로딩 x)
오버라이딩(Overriding) : 부모 클래스로부터 상속받은 메소드의 내용을 변경
이때 부모에 있는 똑같은 메소드를 자식이 구현해서 부모의 메소드를 없는 체 한다.
헷갈리지 않게 위에다 @Override
라고 붙여두기도 한다.
조건 : 부모 클래스의 메소드와 이름, 매개변수, 반환타입이 같아야한다.