💡 객체지향 언어 = 프로그래밍 언어 + 객체지향의 개념 및 규칙
💡 제품을 생성하기 위한 데이터(변수, 메서드(함수))를 가지는 전체적인 틀
class 클래스명 {
변수와 메서드 정의
}
public class Example {
int a = 10; // 필드
void printX() {...} // 메서드
Example {...} // 생성자
class Example2 {...} // 이너 클래스
💡 클래스의 멤버 : 필드(속성, 변수)과 메서드
❔ 한가지 궁금
위 예시에는 public 클래스가 2개 이상 올 수 없다고 했으나 학습자료 예시에는 public 클래스 내부에 다른 public 클래스가 있음. 실행도 됨. 내부에 있는건 상관이 없는걸까?
💡 인스턴스화
인스턴스는 객체와 같은 의미이지만 객체보다 작은 개념이다.
A라는 클래스를 사용해 객체를 생성하는 것을 '인스턴스화'라고 하며 인스턴스화를 통해 생성된 객체를 'A 인스턴스'라고 하는 것이 일반적이다.
클래스명 변수명 = new 생성자(); // 클래스명의 인스턴스를 생성
// 생성자는 클래스명과 이름이 같아야함.
💡 new 연산자는 객체(인스턴스)를 만들어진 객체에 주소를 알려주는 역할을 한다.
대입연산자(=)는 생성된 객체를 주소와 연결해주는 역할을 한다.
class Tv {
int channel; // Tv클래스의 변수 선언
void channelUp() { --channel;} // Tv클래스의 메서드 선언
위 예시코드에서 클래스 Tv의 인스턴스를 생성해보자.
Tv t; // 1번 과정.
t = new Tv(); // 2번 과정.
1번 과정 : Tv클래스 타입의 참조변수t를 선언
참조변수t의 저장공간이 메모리에 생성된다.
2번 과정 : 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성
즉, 참조변수t에 새로 생성된 인스턴스의 주소를 저장.
💡 객체 속성의 값은 기본적으로 초기화 되어있어 0, null, false값이 저장되어 있다.
속성의 값을 넣어주려면 참조변수.변수명으로 넣어줄 수 있음. (예, t.channel = 7;)
class variables { // 클래스영역 시작
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static+iv)
void method() { // 메서드영역 시작
int lv = 0; // 지역 변수
} // 메서드영역 끝
} // 클래스영역 끝
💡 클래스 변수 -> 모든 인스턴스가 공통된 저장공간을 공유
인스턴스 변수 -> 인스턴스가 생성될 때, 독립적인 저장공간을 갖는다.
💡 클래스는 자동으로 생성되기 때문에 인스턴스화를 하지 않아도 사용이 가능하다.
사용예시 : (클래스명이 A라면) A.클래스변수명
💡 클래스 변수는 static + iv 라고 볼 수 있다.
💡 인스턴스 내의 메서드는 힙 메모리에 올라가 클래스 영역과 공유한다. -> 재사용성
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
💡 메서드 반환타입이 void일 경우 return문은 생략된다.
메서드 이름(매개변수1, 매개변수2, ...); //매개변수의 개수는 메서드에 따라 다름.
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
add 메서드를 호출하는 방법
add(1, 3);
출력값 : 4
메서드 앞에 static이 있으면 static메서드, 없으면 인스턴스 메서드라고 한다.
💡 Static메서드는 인스턴스 메서드 호출이 불가능하다.
왜? 인스턴스 메서드는 인스턴스를 생성 후 사용할 수 있고 static메서드는 항상 사용이 가능하다. 따라서 인스턴스 생성 전에는 인스턴스 멤버들이 없기 때문에 static메서드에서 인스턴스 멤버 사용이 불가능하다.
class MyMath {
long a, b; //iv
long add() {
return a+b;
} //인스턴스 메서드
static long add(long a, long b) {
return a+b;
} //static메서드
}
class MyMathTest {
public static void main(String args[]) {
System.out.println(MyMath.add(200, 100); //static 메서드 호출
MyMath mm = new MyMath(); //인스턴스 생성
mm.a = 200;
mm.b = 100;
System.out.println(mm.add()); //인스턴스 메서드 호출
한 클래스 안에 같은 이름의 메서드 여러개를 정의하는 것.
int add(int a, int b) { return a+b;}
int add(int x, int y) { return x+y;}
오버로딩 아님. (매개변수의 타입이 같음) //메서드 중복 정의 에러
int add(int a, int b) { return a+b;}
long add(int a, int b) { return (long)(a+b);}
오버로딩 아님. (반환 타입이 다르나 그 것은 오버로딩 성립에 영향을 미치지 않음
매개변수의 타입이 같으므로 아님) //메서드 중복 정의 에러
long add(int a, long b) { return a+b; }
long add(long a, int b) { retunr a+b; }
메서드 이름이 같고 매개 변수의 타입이 다르기 때문에 오버로딩이 맞음.