객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)
객체지향 핵심 개념
1. 캡슐화
2. 상속
3. 추상화
4. 다형성
클래스와 객체
클래스의 정의 : 객체를 정의해 놓은 것, 제품 설계도
클래스의 용도 : 클래스는 객체를 생성하는데 사용
객체의 정의 : 실제로 존재하는 것, 사물 또는 개념, 제품
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
객체 = 속성(변수) + 기능(메서드), 인스턴스를 대표하는 일반적인 용어
인스턴스 : 특정 클래스로부터 생성된 객체
한의 소스파일에 여러 클래스를 작성하는 경우
# Hello.java
# public class가 있는 경우, 소스파일의 이름은 public class의 이름과 같아야한다.
public class Hello {}
class Hello2 {}
# Hello.java
# public class가 없는 경우, 소스파일의 이름은 Hello, Hello2 모두 가능하다.
class Hello {}
class Hello2 {}
public class는 클래스 파일 당 1개만 존재해야 하며, 소스파일의 이름은 public 클래스와 동일해야한다.
객체의 생성과 사용
Tv t = new Tv(); // Tv클래스인 t인스턴스 생성
t.channel = 7; // Tv클래스의 메서드를 사용
t.channelDown();
객체의 배열
객체 배열은 참조변수의 배열과 같다.
Tv[] tvArr = new Tv(3);
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
// 객체 배열은 참조변수의 배열이기 때문에 요소에 객체를 ㅐㅇ성해야한다.
// 위의 줄을 아래와 같이 한 줄로 만들 수 있다.
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
클래스의 정의
클래스 = 데이터 + 함수
1. 변수 : 하나의 데이를 저장할 수 있는 공간
2. 배열 : 같은 타입의 여러 데이터를 저장할 수 있는 공간
3. 구조체 : 서로 다른 타입의 여러 데이터를 저장할 수 있는 공간
4. 클래스 : 구조체와 함수의 결합
선언 위치에 따른 변수의 종류
class Variables {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method() {
int lv = 0; // 지역변수
}
}
클래스에 선언된 변수 = 인스턴스 변수 = iv : 클래스의 모든 영역에서 사용가능, 인스턴스가 생성될 때 사용 가능
메서드 안에 선언된 변수 = 지역변수 = lv : 메서드 안에서만 사용 가능
클래스에 선언된 변수 중 static이 붙은 변수 = 클래스 변수 = cv : 클래스가 메모리에 올라갈 때 자동으로 만들어지므로, 인스턴스를 생성할 필요 없이 바로 쓸 수 있다.
인스턴스 변수는 주로 개별 속성에, 클래스 변수는 공통 속성에 많이 사용하는 편이다.
class Card {
String kind;
int number;
static int width = 100;
static int height = 250;
}
Card c = new Card();
c.kind = "HEART";
c.number = 5;
Card.width = 200;
Card.height = 300;
Return문, 반환값
return문 : 실행중인 메서드르 종료하고, 호출한 곳으로 돌아간다. 메서드 마지막에는 반드시 return문을 작성해야한다(반환값이 void가 아닐 경우)
int multiply(int x, int y) {
int result = x * y;
return result;
}
호출스택
호출스택 : 메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리가 할당되고, 메서드가 종료되면 메모리가 제거된다.
클래스 메서드(Static메서드)와 인스턴스 메서드
인스턴스 메서드
- 인스턴스 생성 후 호출
- 메서드 내에서 인스턴스 변수 사용 가능
- 참조변수 메서드 이름()으로 호출
클래스 메서드
- 객체 생성 없이 바로 호출
- 메서드 내에서 인스턴스 사용 불가능
- 클래스이름.메서드이름()으로 호출
class MyMath2 {
long a, b; // 인스턴스 변수
long add() { // 인스턴스 메서드
return a+b;
}
static long add(long a, long b) { // 클래스 메서드
return a+b;
}
}
public static void main(String[] args) {
System.out.println(Myath2.add(200L, 100L)); // 클래스 메서드 호출
MyMath2 m = new MyMath2(); //인스턴스 생성
mm.a = 200L;
mm.b = 100L;
System.out.println(mm.add()); // 인스턴스 메서드 호출
}
오버로딩
한 클래스 안에 같은 이름의 여러 메서드를 정의하는 것
void println()
void println(boolean x)
void println(char x)
void println(int x)
void println(long x)
void println(String x)
...
만약 오버로딩이 지원되지 않으면, 모두 이름이 달라야 한다.
오버로딩 성립 조건
- 이름이 같아야한다.
- 매개변수 개수 또는 타입이 달라져야한다.
- 반환 타입의 영향은 없다.
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 x, int y) { return (long) x+y; }
// 오버로딩 아님 중복정의
int add(int a, int b) { return a+b; }
long add(long x, long y) { return x+y; }
// 오버로딩
long add(long a, int b) { return a+b; }
long add(int x, long y) { return x+y; }
// 오버로딩인데 만약 add(3,3)하면 두 메서드 모두 가능하므로 에러가 난다
생성자
인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
객체 인스턴스 변수에 초깃값을 대입해준다.
- 이름이 클래스 이름과 같아야한다.
- 매개변수가 없는 생성자는 기본 생성자
- 매개변수가 있을 경우 대입한 값을 인스턴스 변수에 전달한다.
- 리턴값이 없다.
- 모든 클래스는 하나 이상의 생성자가 있어야 한다.
Card c = new Card(); // 뒤에 있는 new Card가 생성자 호출하는 것임
기본생성자
class Data_1 {
int value;
}
class Data_2 {
int value;
Date_2(int x) {
value = x;
}
}
class Example {
public static void main(String[] args) {
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2(); // Data_2는 기본생성자가 없어서 에러 발생
}
클래스에 매개변수가 있는 생성자가 있을 경우, 기본생성자가 자동으로 만들어지지 않는다.
생성자 this()
- 같은 클래스의 생성자에서 다른 생성자를 호출할 때 사용한다.
- 다른 생성자 호출시 첫 줄에서만 사용 가능하다.
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(String color) {
door = 5;
this(color, "auto", 4); // 생성자 두번째 줄에서 this를 사용했기에 에러 발생
}
Car(String color, String gearType, int door) {
this.color = color; // 여기서 this는 생성자 호출이 아니라, 클래스 자기 자신을 가리키는 this이다. this = Car 클래스
this.gearType = gearType;
this.door = door;
}
}
변수의 초기화
지역변수는 수동으로 초기화 해야한다.
class InitTest {
int x;
int y = x;
void method() {
int i;
intn j = i; // 에러 발생. 지역변수 i를 초기화 하지 않고 사용
}
}
지역변수는 짧은 시간 동안 생성되었다가 사라지기 때문에 매번 0으로 초기화하면 메모리 낭비가 심해진다. 따라서 수동 초기화 하여 메서드가 생성되었을 때 만들어지게 작성한다.
멤버 변수는 자동 초기화 된다(인스턴스 변수, 클래스 변수)
초기화 순서 : 명시적 초기화(선언문에서 바로 초기화) -> 초기화 블록 -> 생성
'웹 개발 > JAVA' 카테고리의 다른 글
[JAVA] 알아두면 도움 되는 자바 문법(2) (0) | 2024.10.21 |
---|---|
[JAVA] 알아두면 도움 되는 자바 문법(1) (0) | 2024.10.15 |