Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발자 꼬부기의 성장일기

9일차 - Java 객체지향 기초(1) : 클래스와 객체, 필드와 메서드 본문

언어공부/[코드스테이츠] 백엔드부트캠프

9일차 - Java 객체지향 기초(1) : 클래스와 객체, 필드와 메서드

다죵 2023. 4. 21. 16:43

클래스와 객체

클래스

클래스는 하나의 틀,  붕어빵 틀과 같다. 클래스라는 틀을 이용해 인스턴스가 생겨났다가 사라졌다 한다.

클래스를 통해 생성된 객체를 인스턴스라고 한다. 각 객체를 만드는 과정을 인스턴스화 라고 지칭한다.

 

객체는 모든 인스턴스를 포괄하는 넓은 의미

인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조하며

두가지다 의미를 혼용해서 쓰기도한다.

 

클래스를 한번 정의해 놓으면, 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지 고민하지 않고, 클래스로부터 객체를 생성해서 사용하기만하면 된다.

 

클래스의 구성요소와 기본 문법

public class ExampleClass {
	int x = 10; // (1)필드
	void printX() {...} // (2)메서드
	ExampleClass {...} // (3)생성자
	class ExampleClass2 {...} // (4)이너 클래스
} 

클래스 종류

일반 클래스

중첩 클래스 : 정적 중첩 클래스.

- 선언위치는 클래스의 내부이며 클래스와 연관관계가 밀접한 경우에 사용

- static만 선언 가능

class (일반 클래스 이름)
{
  static class (중첩클래스 이름)
  {
    //내용
  }
}

내부 클래스 : 비 정적 중첩 클래스

- 선언위치는 클래스의 내부이 이벤트를 처리하거나 데이터 구조선언을 하기 위해 사용

- static 메소드 혹은 변수를 가질 수 없다.

class (일반 클래스 이름)
{
  class (내부클래스 이름)
  {
    //내용
    //static 메소드를 사용하지 않음
  }
}

지역 클래스 : 로컬 클래스 

- 선언위치는 메소드 내부이며 메소드 내에서만 사용되는 클래스를 생성

- 지역변수를 final로 생성하는 특징이 있다.

- private을 포함하여 지역클래스를 포함하는 클래스의 모든 멤버에 접근이 가능

class (일반 클래스 이름)
{
   메소드
   {
      static class (지역클래스 이름)
      {
         //내용
         //지역변수는 final로 선언
      }
   }
 }

익명클래스 :  단 한번만 정의하여 사용

- 클래스 선언후에 ';'을 붙이는 특징이 있음.

- 익명 객체는 단독 생성이 불가능 하며, 클래스를 상속하거나 인터페이스를 구현

- 익명객체에 새롭게 정의된 필드와 메소드는 익명 객체 내부에서만 사용이 가능

class (일반 클래스 이름)
{
  메소드
  {
     new class (익명 클래스 이름)()
     {
        //내용
     }
  }
}

추상클래스 : 추상메소드를 멤버로 가지고 있는 클래스

abstract class (추상 클래스 이름)
{
   ...
   abstract (반환타입) (메소드 이름)();
   ...
}

인터페이스 : 추상클래스 중에서 오직 추상메소드와 상수만을 멤버로 가지고 있는 것을 인터페이스(Interface)

기본적으로 추상 메소드의 집합. 

public interface (인터페이스 이름) 
{
  //추상 메소드
}

 


객체(Object)

1) 속성(필드) : 차를 예로 들 경우 모델, 바퀴수, 컬러 등등

2) 기능(메서드) : 차를 예로 들 경우 시동걸기, 가속하기, 정지하기, 후진하기 등

3) 필드, 메서드, 이너클래스합쳐서 멤버(member) 라고 부름.

 

객체의 생성

new 연산자 사용

Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스

포인트(.) 연산자 사용해서 접근 가능

bmw.Drive();

new 키워드와 생성자를 통해 클래스의 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.

Car c = new Car();

클래스 Car 는 클래스 영역에 저장

참조 변수 c스택 영역에 저장

인스턴스는 생성자로 만들어지고, 힙 메모리 영역에 저장


필드와 메서드

필드

: 클래스에 포함된 변수를 의미하는 것으로 객체의 속성을 정의할 때 사용

변수는 세가지로 분류되는데 클래스 변수, 인스턴스 변수, 지역 변수 이다.

이중 클래스 변수, 인스턴스 변수가 필드에 해당한다.

이 두가지도 다시 static 유무로 구분한다.

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

인스턴스 변수 : 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수

 - new 생성자()를 통해 인스턴스가 생성될 때 만들어진다.

- 클래스를 통해 만들어진 인스턴스는 힙 메모리의 독립적인 공간에 저장된다.

- 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다.

- 객체가 없어지지 않는 한 절대로 삭제되지 않음.

- 직접적으로 초기화를 실행하지 않더라도 강제로 초기화

 

클래스 변수 : 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유

- 주로 static 키워드를 사용하여 클래스 변수를 선언

- 클래스 변수는 인스턴스를 따로 생성하지 않고 언제든지 클래스명.클래스변수명 을 통해 사용이 가능

- 클래스 영역에 저장되어있기 때문에 공유 가능함.

- 직접적으로 초기화를 실행하지 않더라도 강제로 초기화

 

지역변수 : 메서드 내에 선언되며 메서드 내({} 블록)에서만 사용가능한 변수

- 스택 메모리에 저장

- 메서드가 종료되는 것과 동시에 함께 소멸(GC에 의해 소멸됨)

- 직접 초기화하지 않으면 값을 출력할 때에 오류가 발생

 

메모리와 초기화 :

힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만,

스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언 시 반드시 초기화를 실행해주어야 한다.

 


static 키워드

- static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드

 

1) 정적 멤버(static member)

- static이 붙어있는 멤버 ‘정적 멤버(static member)’

- 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용 가능

- 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간 가짐.

- static 키워드는 클래스의 멤버 앞에 붙일 수 있다.

 

2) 인스턴스 변수

- static이 붙어있지 않은 '인스턴스 변수'와 구분

- 객체를 생성한 이후에 변수와 메서드에 접근하여 해당 멤버를 사용가능

정적 멤버는 클래스 내부에 저장 공간을 가짐 => 객체 생성 없이 사용함.

 

예제)

공유변수 num2는 1500으로 인스턴스 상관없이 무조건 마지막 값 가지고 있다.


메서드(Method)

: 특정 작업을 수행하는 일련의 명령문들의 집합

public static int add(int x, int y) { // 메서드 시그니처
	int result = x + y; // 메서드 바디
	return result;
}

자바제어자 반환타입 메서드명(매개변수) {

메서드 내용

}

반환타입 : void(없는것) / int / double/ ...


메서드의 호출

메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야한다.

포인트 연산자(.)를 통해 메서드를 호출

클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.

 

오버로딩 : 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것

 

-  무조건 같은 메서드명을 사용한다고 해서 오버로딩이 되는 것이 아니다

  • 메서드를 오버로딩하려면
    • 메서드의 이름이 같아야 합니다.
    • 매개변수의 개수 또는 타입이 달라야 합니다.