컴공/Java

객체

vy00 2024. 10. 27. 18:12

[클래스를 먼저 생성 -> 클래스를 통해 객체를 만듦. -> 객체를 만들면, 안에 데이터 삽입>

 

객체란? 

:클래스에서 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것.

 데이터와 기능을 포함한 모든 것.

 => 익명클래스(클래스를 따로 정의하지 않고 일시적으로 생성되는 객체), 배열 등

       

클래스란?

:객체의 특성에 대한 정의를 한 것으로 캡슐화를 통해 기능을 포함한 개념, 사물이나 개념의 공통 요소를 추상화하여 정의

 

추상화란?

:유연성을 확보하기 위해 구체적인 것은 제거한다는 의미.

프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정

 

인스턴스란?

:항상 클래스에서 만들어진 객체를 의미.

 특정 클래스(Class)로부터 생성된 객체를 더 구체적으로 인스턴스라고 한다.

 즉, 모든 인스턴스는 객체이지만, 모든 객체는 인스턴스는 아니다.

 


<객체 지향 언어>

Stack: 메서드 호출 시 생성되는 참조 변수가 저장된다.

예를 들어, Student s, Student t 같은 참조 변수들이 여기에 저장된다.

스택은 메서드가 끝나면 자동으로 해제된다.

 

Heap: new 키워드를 통해 생성된 객체가 저장된다.

각 개체는 힙에 독립된 공간을 차지하며, 스택의 참조 변수가 이 객체를 가리킨다.

힙의 객체는 참조가 없어질 때(더 이상 스택에서 참조되지 않을 때) GC(Garbage Collector)에 의해 제거된다.

 

예를 들어, Student s = new Student();

여기에서 Student s는 클래스 타입으로 쓰인다. 즉, 자료형으로 쓰인다. s는 변수명이다.

new Student()는 Studnet 클래스를 생성하라는 의미이다.

 


<클래스>

 

package com.obj.model.vo;

//모든 패키지에서 이용이 가능한 클래스
public class PublicTestClass {
	//접근제한자 : 이용범위를 설정하는 예약어
	//public : 프로젝트내 모든 패키지에서 이용 가능(이용 가능하다는 것은 생성하는 것)
	//default : 프로젝트내 같은 패키지에서만 이용 가능(이용 가능하다는것은 생성하는 것)
	
}

import com.obj.model.vo.PublicTestClass;
public class BasicMain {
	public static void main(String[] args) {
		//접근제한자가 public인 클래스는 이용이 가능하다.
		new PublicTestClass(); //클래스를 생성하라는 것이다. 인스턴스화하라는 이야기.
		// new com.obj.model.vo.PublicTestClass() 이렇게 작성하면, import 안 써도 된다. 
		
		//접근제한자가 default인 클래스 다른 패키지에서는 이용이 불가능하다.
		//new DefaultTestClass();
	}
}

 

//접근제한자가 default인 클래스
//같은 패키지에서만 이용이 가능하다.
class DefaultTestClass {
	
}


public class TestMain {
	public static void main(String[] args) {
		//같은 패키지내에서는 import 경로를 하지 않아도 된다.
		//다른 패키지내에서는 import 경로를 사용해야 한다.
		new DefaultTestClass(); 
	}
}

<필드>

필드란?

:클래스의 멤버변수

(멤버변수는 클래스에 속하는 각가의 변수를 지칭할 때 사용)

 

필드 접근제한자는 클래스만 생성해서 사용하는 것이 아니라, 객체도 생성이 되어야 사용이 가능하다.

 

 


<생성자>

:메서드는 객체의 기능과 동작을 수행하며, 여러 번 호출할 수 있다.

 생성자는 객체를 초기화하는데 사용되며, 객체가 생성될 때 한 번만 호출된다.

 생성자와 메서드를 구분함으로써, 초기화와 기능을 명확히 분리하고 코드를 더 유연하고 유지보수하기 쉽게 만든다.

 

 

기본 생성자란?

:작성하지 않은 경우, 클래스 사용시 JVM이 자동으로 기본 생성자 생성.

 

매개변수 생성자란?

:객체 생성시 전달받은 객체를 초기화 하기 위해 사용.

 매개변수 생성자 작성 시 JVM이 기본 생성자를 자동으로 생성해주지 않음.

 상속에서 사용 시 반드시 기본 생성자를 작성.

 오버로딩을 이용하여 작성.

 

오버로딩이란?

:한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법

 =>조건 

    -같은 메소드 이름

    -다른 매개변수의 개수 또는 다른 매개변수 타입

 

this란?

:모든 인스턴스 메소드에 숨겨진 채 존재하는 레퍼런스로 할당된 객체를 가리킴.

 함수 실행시 전달되는 객체의 주소를 자동으로 받음.

 

this()란?

:생성자, 같은 클래스의 다른 생성자를 호출할 때 사용되며 반드시 첫 줄에 선언.

 같은 클래스 내의 다른 생성자를 호출함으로써 중복된 초기화 코드를 제거하고, 코드를 더 깔끔하고 유지보수하기 쉽게 만든다.

생성자 오버로딩이 많아지는 경우 this()는 필수적인 도구이다.

 


<메소드>

 

 

 

-setter 메소드란?

:필드에 변경할 값을 전달 받아서 필드 값을 변경하는 메소드

 

-getter 메소드란?

:필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메소드

 

 :스택은 메서드 호출 정보를 저장하는 것이다. 

 스택 메모리는 주로 메서도 호출 스택을 관리하는 역할이다.

 스택에는 주소뿐만 아니라, 호출된 메서드에 필요한 정보(매개변수, 지역변수, 반환주소 등)도 저장된다.