본문 바로가기

웹 개발/JAVA

[JAVA] 객체지향프로그래밍(1)

객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)

객체지향 핵심 개념

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으로 초기화하면 메모리 낭비가 심해진다. 따라서 수동 초기화 하여 메서드가 생성되었을 때 만들어지게 작성한다.

멤버 변수는 자동 초기화 된다(인스턴스 변수, 클래스 변수)

초기화 순서 : 명시적 초기화(선언문에서 바로 초기화) -> 초기화 블록 -> 생성