본문 바로가기
프로젝트 개발 기록/[개발] java | spring

[Java] 클래스와 객체, 변수와 메서드, 오버로딩, 생성자

by HelloJudy 2022. 9. 17.

1. 객체지향언어

✔️ 객체 지향 프로그래밍

  • 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. (협력)
  • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.

✔️ 특징 

  • 코드의 재사용성이 높다.
  • 코드의 관리가 용이하다.
  • 신뢰성이 높은 프로그래밍을 가능하게 한다.(캡슐화)

✔️ 핵심개념

  • 캡슐화
  • 상속
  • 추상화
  • 다형성

 

자바 언어

  • 자바 언어의 다형성을 활용
    • 역할 = 인터페이스
    • 구현 = 인터페이스를 구현한 클래스, 구현 객체
  • 객체를 설계할 때 역할과 구현을 명확히 분리
  • 객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

 

자바 언어의 다형성

  • 오버라이딩을 떠올려보자.
  • 오버라이딩 된 메서드가 실행
  • 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
  • 물론 클래스 상속 관계도 다형성, 오버라이딩 적용가능

 

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스를 실행 시점유연하게 변경할 수 있다.
  • 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야함.
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

 


2. 클래스와 객체

✔️ 클래스

  • 정의: 클래스란 객체를 정의해 놓은 것이다.
  • 용도: 클래스는 객체를 생성하는데 사용된다.

✔️ 객체

  • 정의: 실제로 존재하는 것. 사물 또는 개념
  • 용도: 객체가 가지고 있는 기능과 속성에 따라 다름

✔️ 객체와 인스턴스 

출처: https://whatisthenext.tistory.com/36

 

 

  • 인스턴스화: 클래스로 객체를 생성하는 과정
  • 인스턴스 (객체): 특정 클래스로 생성된 객체

 

✔️ 속성과 기능 

객체의 구성요소가 속성과 기능이다.

 

  • 속성(property) -> 멤버변수(member variable) ,특성(attribute) ,필드(field), 상태(state)
  • 기능(function) -> 메서드(method), 함수(function), 행위(behavior)

 

✔️ 인스턴스의 생성과 사용 

class Tv { 
	// Tv의 속성(멤버변수)   
	String color;           // 색상 
	boolean power;         	// 전원상태(on/off) 
	int channel;           	// 채널 

	// Tv의 기능(메서드) 
	void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드  
	void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
	void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드  
}

class Tv2 {
	public static void main(String args[]) {
		Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

		t1.channel = 7;    // channel 값을 7으로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");

		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
	}
}

 

Tv2 클래스에서 Tv 객체를 생성한 뒤 사용한다.  

 

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

 


3. 변수와 메서드 

✔️ 변수

class variables {
	int iv;
    static int cv;
    
    void method()
    {
    	int lv = 0;
     }
}

 

변수의 종류 선언위치 생성시기
클래스 변수 (cv) 클래스 영역  클래스가 메모리에 올라갈 때
인스턴스 변수 (iv) 인스턴스 생성시
지역 변수 (lv) 메서드 영역 변수 선언문 수행시

 

인스턴스 변수

  • 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
  • 인스턴스마다 고유한 상태를 유지해야하는 속성인 경우 사용한다.

 

클래스 변수

  • 멤버변수 중 static(선언)이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다.
  • 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
  • 전역변수의 성격을 가진다.

 

지역 변수

  • 메서드가 종료되면 소멸되어 사용할 수 없다.

 

인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.

 

 

✔️ 메서드

특정 작업을 수행하는 일련의 문장들을 (작업 단위로) 하나로 묶은 것이다.

 

메서드를 사용하는 이유

  • 높은 재사용성 (reusability)
  • 중복된 코드의 제거
  • 프로그램의 구조화

반환 타입

  • 반환값이 없는 경우 'void'를 적어야한다.

static 메서드

  • 객체 생성 없이 호출이 가능하다.

 

 

✔️ JVM의 메모리 구조

1) 메서드 영역 (method area)

 

: 프로그램 실행 중 어떤 클래스가 사용되면, JVM이 해당 클래스의 파일(*.class)을 읽어서 분석하여 그 정보를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다.

 

2) 힙 (heap)

 

: 인스턴스변수(instance variable)들이 생성되는 공간이다.

 

3) 호출스택 (call stack)

 

: 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

 

 


4. 오버로딩

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 오버로딩'(overloading)'이라 한다.

 

✔️ 조건 

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.

* 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 

✔️ 장점 

1. 메서드를 하나의 이름으로 정의할 수 있다.

2. 메서드의 이름을 절약할 수  있다.

 

 


5. 생성자

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

 

✔️ 수행 과정 

Card c = new Card();

 

  1. 연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
  2. 생성자 Card()가 호출되어 수행된다.
  3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

 

✔️ 기본 생성자 (default constructor)

클래스이름() { }

클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 기본 생성자를 자동으로 추가해준다.

 

* 주의

기본 생성자가 컴파일러에 의해 자동 추가 되는 경우는 '클래스 내에 정의된 생성자가 하나도 없을 때' 뿐이다.

 

  • 매개변수가 있는 생성자 (예시)
Car c = new Car("white", "auto", 4);

 

✔️ this(), this 

  • 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

this()

  • this()는 생성자이다. 

this

  • this는 참조변수이다.
  • this.color = color로 메서드 안에서 사용된다면 this.color인스턴스 변수이고 color지역 변수이다.
  • static메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없는 것처럼, this 역시 사용할 수 없다.

 

  • 예시
Car(String color) {
    door = 5l  // 첫번 째 줄
    Car(color, "auto", 4);  // 에러1:  생성자는 첫 줄에서만 호출, 에러2: this라고 해야한다.
}

 

 


📌 Reference

  • 남궁 선, 「자바의 정석」, 도우출판
반응형

댓글