[Java] 객체지향(클래스, 인스턴스, 생성자, 패키지)

클라우드·2024년 4월 2일
0

Java

목록 보기
3/20
post-thumbnail

1. class

  • class를 간단히 정의하자면
    1. 객체 모델링의 수단(전체적인 프로그램 설계 시)
    2. instance를 생성하는 수단(프로그래밍 실행 관점)
    3. ADT(자료구조 측면에서 프로그램을 바라볼 때)

2. instance

  • class에 정의된 field(변수), method(함수)를 사용하기 위해서 메모리에 공간을 확보한 것

3. constructor(생성자)

  • class로 부터 instance를 생성하기 위해서 호출되는 것.
  • 당연히 class 내부에 위치한다.
  • 모든 class는 무조건 1개의 이상의 constructor를 가지고 있다.

3.1 생성자의 특징

  • constructor은 이름이 클래스의 이름과 같다.
    • 생성자(인스턴스의 초기화)
      public class Car {
          private String color;
          private String model;
          
          // 기본 생성자
          public Car() {
              this.color = "Red";
              this.model = "Toyota";
          }
          
          // 매개변수를 받는 생성자
          public Car(String color, String model) {
              this.color = color;
              this.model = model;
          }
          
          // 기타 메서드
      }
  • 메소드는 아니다. (메소드는 해당 메소드가 만드는 리턴 타입이 명시가 되어야 한다.)
    • 리턴 타입
    1. 기본형(primitive types): int, double, boolean 등과 같은 기본 데이터 타입을 리턴할 수 있다.

    2. 참조형(reference types): 클래스, 인터페이스, 배열 등과 같은 참조형 데이터 타입을 리턴할 수 있다.

    3. void: 메서드가 아무런 값을 반환하지 않을 경우 void를 리턴 타입으로 지정한다. 이는 메서드가 작업을 완료한 후 어떠한 값도 반환하지 않음을 의미한다.

      public int add(int a, int b) {
          return a + b;
      }
      public void greet() {
          System.out.println("Hello!");
      }
  • new 라는 키워드와 함께 호출되며 주로 하는 일은 instance의 초기화를 담당한다.

3.2 클래스와 패키지

  • 클래스를 묶어 놓은 논리적인 단위, 유사한 종류의 클래스를 꾸러미로 묶어 놓음, 클래스의 집합 → 패키지
  • 패키지는 일반적으로 소문자로 이름을 정함
  • 패키지는 계층구조를 가질 수 있다. 점(.)을 활용해서!
  • public이 붙은 class는 파일 이름 역시 해당 class의 이름으로 정해야 한다.
  • 한 파일에는 public이 붙은 class는 하나만 존재해야 한다.
  • 생성자를 안 쓰면 자동으로 생성자를 넣어주긴 한다.
  • 예제 1
// package는 관련 있는 class들을 하나로 묶는 논리적인 단위이고
// 물리적으로는 폴더로 표현된다.
// 거의 예외없이 package는 사용을 한다.

// 하나의 자바 파일에 public이 붙은 class는
// 두 개 이상 존재할 수 없다. (하나만 있어야 한다.)
// 만약, public class가 존재하면 파일명은 반드시
// public class 이름으로 설정해야 한다.

package test;

public class HelloWorld {
	
	// field들
	int age;
	
	// constructor들
	// constructor는 이름이 클래스 이름과 같다.
	// 모양은 method와 유사하다. (리턴 타입 존재 X)
	// constructor는 instance의 초기화를 담당하는 일을 주로 한다.
	public HelloWorld() {
		
	}
	// 만약 생성자를 직접적으로 명시하지 않으면
	// javac compiler가 소스 코드를 bytecode로 컴파일 할 때
	// default constructor를 자동으로 삽입한다.
	// default constructor는 인자도 없고 하는 일도 없는 생성자다.
	// default constructor는 반드시 작성하는 버릇을 들이자.
	// 그러고 오버로딩해서 여러 생성자를 만들던가 한다.
	
	// method들
	public void sayHello() {
		
	}
	
	// 프로그램의 entry point 진입점
	public static void main(String args[]) {
		System.out.println("안녕하세요~");
		
		// 인스턴스 만들기
		// 메모리 공간의 heap 영역에 대부분 인스턴스가 만들어진다.
		// java는 강타입 언어기 때문에 무조건 데이터 타입을 명시해 주어야 한다.
		// a는 reference variable이라고 부른다.
		// Heap 영역의 instance의 시작 주소를 가지고 있기 때문에 그렇다.
		HelloWorld a = new HelloWorld();
	}
}
  • 예제 2
package test;

public class MyTest {

    // static block
    // 클래스가 로드될 때 가장 먼저 수행된다.
    static {

    }

    // 필드들
    // a라는 변수에 100을 넣을 것이다.
    // 넣는 것에서 끝나는 것이 아니라, 클래스로부터 인스턴스를 만들어야 함.
    // 인스턴스가 있어야 사용할 수 있는 변수
    // 즉, instance variable이라고도 한다.
    // instance variable은 메모리 heap 영역에 만들어진다.
    public int a = 100;

    private static int b = 200; // java에는 전역 변수는 따로 없다.
    // class variable
    // static이 붙으면 Method Area에 올라간다.
    // heap에 instance가 없어도 사용할 수 있다.
    // instance에는 b가 저기 있다고 알려주는 참조 값이 있다.

    private int c = 300;

    // 생성자들
    public MyTest() {

    }

    MyTest(int k) {

    }

    // 메소드들

    public static void main(String args[]) {
        // 위에 있는 a라고 되어 있는 field를 사용하려면
        // 당연히 instance가 존재해야 한다.
        MyTest obj = new MyTest();

        // obj 라는 시작 주소값이 들어있는 참조 변수 = 객체
        // obj 라는 reference variable을 이용해서 Heap 영역에
        // 생성된 instance를 사용할 수 있다.
        // reference variable을 이용해서 instance를 사용할 때
        // 우리가 이용하는 연산자가 있다.
        // dot operator(.)
        System.out.println("a의 값은 : " + obj.a);
        // import java.lang.*; 을 원래 추가해야하지만 javac 컴파일러가 자동으로 추가해준다.

        // 지역 변수는 메소드가 호출될 때 만들어지고
        // stack 영역에 공간이 잡히고
        // 메소드가 끝나면 pop되면서 사라지는 변수
        int k = 200; // 지역 변수(local variable)
        // 지역 변수는 stack 영역에 만들어진다.
    }

}
profile
안녕하세요 :)

0개의 댓글