-객체는 속성과 기능으로 이루어져 있다.
여기서 속성과 기능은 필드와 메서드로 정의할 수 있고 이너클래스와 함께 멤버라고 부른다.
-객체는 아래와 같이 생성 가능
클래스명 참조_변수명 = new 생성자();
-생성한 객체는 . 을 이용해서 접근할 수 있는데 아래와 같다.
참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출
- static 키워드는 정적을 나타냄
풀어서 인스턴스는 메서드를 호출할 때 참조 변수명을 이용해서 호출하지만 static은 클래스 이름으로 호출 가능하다.
또한 인스턴스 변수는 고유성을 가져서 변수에 할당된 값 그대로 출력되지만 static 변수는 값을 공유한다.
- 메서드는 특정 작업을 수행하는 명령문들의 집합
메서드 시그니처와 메서드 바디로 이루어져있고 아래와 같은 구조를 취한다.
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
void 타입은 return을 하지 않는다.
메서드 오버로딩은 하나의 클래스 안에 같은 일므의 메서드를 여러 개 정의하는 것인데 이 때 이름은 같되 매개변수의 개수 또는 타입이 달라야 한다.
- 생성자는 객체를 생성하는 역할을 하는 클래스의 구성 요소로, 인스턴스가 생성될 때 홀출되는 인스턴스 초기화 메스드
new 키워드로 객체를 생성할 때 호출되는 것이 생성자
1. 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 타입이 없다.
또한 클래스 안에는 한개 이상의 생성자가 꼭 있어야하고 생성자를 만들지 않으면 기본생성자가 자동으로 생성된다.
기본생성자와 매개변수가 있는 생성자가 있다.
this와 this()의 차이점
this()는 생성자 내부에서만 사용가능하고 반드시 첫 줄에 위치해야한다.
자신이 속한 클래스에서 다른 생성자를 호출할 때 사용함
this는 매개변수가 있는 생성자를 사용할 때 인스턴스 변수와 매개변수를 이름만으로 구분하기 어려워질 때 이를 구분해주기 위해 사용한다.
예시 코드)
public class ConstructorExample {
public static void main(String[] args) {
Car c = new Car("Model x", "빨간색", 250);
System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " + c.getColor() +"입니다.");
}
}
class Car {
private String modelName;
private String color;
private int maxSpeed;
public Car(String modelName, String color, int maxSpeed) {
this.modelName = modelName;
this.color =color;
this.maxSpeed = maxSpeed;
}
public String getModelName() {
return modelName;
}
public String getColor() {
return color;
}
}
- 내부 클래스는 클래스 내에 선언된 클래스로 정적 내부 클래스, 인스턴스 내부 클래스, 지역 내부 클래스가 있다.
종 류 선언 위치 사용 가능한 변수
인스턴스 내부 클래스(instance inner class) |
외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) |
외부 인스턴스 변수, 외부 전역 변수 |
정적 내부 클래스(static inner class) |
외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) |
외부 전역 변수 |
지역 내부 클래스(local inner class) |
외부 클래스의 메서드나 초기화블럭 안에 선언 |
외부 인스턴스 변수, 외부 전역 변수 |
익명 내부 클래스(anonymous inner class) |
클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 |
외부 인스턴스 변수, 외부 전역 변수 |
인스턴스 내부 클래스 예시 코드)
class Outer { //외부 클래스
private int num = 1; //외부 클래스 인스턴스 변수
private static int sNum = 2; // 외부 클래스 정적 변수
private InClass inClass; // 내부 클래스 자료형 변수 선언
public Outer() {
inClass = new InClass(); //외부 클래스 생성자
}
class InClass { //인스턴스 내부 클래스
int inNum = 10; //내부 클래스의 인스턴스 변수
void Test() {
System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
}
}
public void testClass() {
inClass.Test();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
outer.testClass(); // 내부 클래스 기능 호출
}
}
// 출력값
외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)
정적 내부 클래스 예시 코드)
public class Main {
public static void main(String[] args) {
Outer.StaticInClass a = new Outer.StaticInClass();
a.test();
}
}
class Outer {
private int num = 3;
private static int sNum = 4;
void getPrint() {
System.out.println("인스턴스 메서드");
}
static void getPrintStatic() {
System.out.println("스태틱 메서드");
}
static class StaticInClass {
void test() {
System.out.println("Outer num = " + sNum + "(외부 클래스의 정적 변수)");
getPrintStatic();
}
}
}