객체지향 프로그래밍 기초 (1)

강호수·2022년 9월 3일
0

객체지향 프로그래밍(Object Oriented Programming)

  • 특정 사물이 가지는 속성과 기능을 하나의 독립적인 레고 조각으로 만들고, 이를 하나씩 결합하여 원하는 결과물을 만들어감.
  • 개발, 유지 보수가 용이하고 객체를 통해 데이터를 관리한다. 이에 따라 데이터를 손실 없이 관리하기에 용이하다.

클래스(Class)

  • 클래스는 객체를 생성하는데 사용, 객체는 클래스에 정의되고 설계된 내용 그대로 생성
  • 클래스를 통해 생성된 객체를 인스턴스라 한다 → 이러한 과정을 인스턴스화라 함
public class Example{
	int a = 0; //필드 -> 클래스의 속성 나타내는 변수
	void print() { } //메서드 -> 클래스의 기능
	Example { } //생성자 -> 클래스의 객체를 생성
	class Example_2 { } //이너 클래스 -> 클래스 내부의 클래스
}

객체(Object)

  • Car 클래스를 만들고 그 울타리에 모아서 한번에 관리한다. → 인스턴스 생성을 통해 객체 멤버에 각각 접근 가능
class Car {
	private String model;
	private int wheels;
	...

	void power() {...}
	void stop() {...}
	...
}

class CarTest {
	public static void main(String[] args)
	
	Car hyundai = new Car(); //Car 클래스 기반으로 생성된 hyundai 인스턴스
	Car tesla = new Car(); //Car 클래스 기반으로 생성된 tesla 인스턴스
}
  • new 키워드와 생성자를 통해 객체를 생성한다 → 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장한다
  • ‘ Person p = new Person(); ‘
    • Person : 클래스 영역 안에 들어있음
    • p : 참조변수로 스택 영역 안에 들어있음
    • new : 힙 메모리에 저장하겠다 선언
    • Person() : 생성자 → 객체
class Car{
	public String model;
	public int wheels;
	
	public Car(String model, int wheels) { //인스턴스 초기화를 위한 생성자 함수
		this.model = model;
		this.wheels = wheels;
	}

	void power(){
		---
	}
}

class CarTest{
	Car hyundai = new Car("sonata", 4); //객체 생성
	
	hyundai.power(); //메서드 호출
}
  • 위의 code와 같이 인스턴스를 생성하고 쓸 수 있다.

필드(Field)

→ 클래스에 포함된 변수

class Example{
	int a; // 인스턴스 변수
	static int b; // 클래스 변수
	
	void method() {
		int c = 0; // 지역 변수, {} 블록 안에서만 유효
	}
}
  • 인스턴스 변수
    • new 생성자(); 를 통해 인스턴스가 생성될 때 인스턴스 변수가 생긴다
    • 힙 메모리의 독립적인 공간에 저장되고, 그 인스턴스만의 고유한 개별성을 가진다
  • 클래스 변수
    • 공통된 저장공간을 공유한다 → 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야 하는 경우
    • 인스턴스를 따로 생성하지 않고 언제든 클래스명.클래스변수명을 통해 사용이 가능하다
  • 지역 변수
    • 메서드 내에 선언되며 메서드 내 {} 블록 안에서만 사용 가능한 변수이다.

static 키워드

publid class StaticTest{
	psvm {
		Static static1 = new Static();
		Static static2 = new Static();

		static1.num1 = 100;
		static2.num1 = 1000;

		sout(static1.num1);
		sout(static2.num1);

		static1.num2 = 200;
		static2.num2 = 2000;

		sout(static1.num2);
		sout(static2.num2);
	}
}

class Static {
	int num1 = 10;
	static int num2 = 20;
}

100
1000
2000
2000
  • 출력값이 의미하는 것 → num1의 경우에는 인스턴스 변수이다. 따라서 static1과 static2가 각각 다른 값을 갖는다.
      하지만 num2는 클래스 변수이고 static1의 num을 바꾸던 static2의 것을 바꾸던 같은 값을 갖게된다.

메서드 (method)

public static int add(int x, int y){ // 메서드 시그니처
	int result = x+y; // 메서드 바디
	return result;
}
  • 반환타입 → 위에서는 반환 타입 int형이므로 return값이 필요하다. 반환 타입이 void일 경우에는 return 불필요
  • 메서드 호출
    • 클래스 외부에서 실행하기 위해서는 인스턴스 생성해서 사용해야 한다
    • 클래스 내부에서 실행할 때에는 객체를 생성하지 않고도 사용 가능하다

메서드 오버로딩

class Cal {
	public int add() {
	
	}
	public int add(a) {
		return a;
	}
	public int add(a,b) {
		return a+b;
	}
	public int add(a,b,c) {
		return a+b+c;
	}
}
  • 위와 같이 같은 add라는 이름을 갖고 있음에도 다른 return값을 가진다. → 오버로딩(overloading)
  • 오버로딩의 성립 조건
    • 같은 이름의 메서드명을 써야함
    • 매개변수의 개수나 타입이 다르게 정의되어야함
  • 장점 : 하나의 메서드로 여러 경우의 수를 해결할 수 있다.
  • println() 의 overloading 예시 (훨씬 더 많다…)

0개의 댓글