자바/객체지향 프로그래밍(OOP) 16

String과 래퍼 클래스의 객체생성

String과 래퍼 클래스는 왜 객체를 생성하지 않고 사용할 수 있을까?Java에서 String과 래퍼 클래스(Integer, Double, Boolean 등)는 객체 재사용을 위한 특별한 설계 덕분에 new 키워드를 사용하지 않고도 쉽게 사용할 수 있다. 이는 String Pool과 오토박싱 & 캐싱 기법 덕분이다.1. String Pool (문자열 상수 풀)String Pool은 JVM의 힙 메모리에서 특별한 영역으로, 동일한 문자열 리터럴을 공유하여 메모리를 절약하는 기법이다.String s1 = "hello";String s2 = "hello";System.out.println(s1 == s2); // true (같은 객체)"hello"는 String Pool에 저장되며, 동일한 문자열이 있으면 ..

생성자와 객체생성에 대한 이해

생성자와 객체 생성에 대한 이해1. 생성자의 역할생성자(Constructor)는 객체를 생성한 후 초기화하는 작업을 수행합니다.생성자는 메모리 할당을 담당하지 않습니다. 메모리 할당은 new 키워드가 처리하며, 생성자는 메모리가 할당된 이후 호출됩니다.2. 객체 생성 과정의 역할 분담1) 메모리 할당 (new 키워드)JVM이 클래스 설계에 따라 힙 메모리 영역에 메모리 공간을 할당합니다.메모리 공간에는 클래스의 필드가 기본값으로 초기화됩니다.예: int → 0, String → null, boolean → false2) 객체 초기화 (생성자 호출)new 키워드로 메모리 공간이 할당된 후, 생성자가 호출됩니다.생성자는 객체 생성 시 전달받은 인자를 사용해 필드 값을 설정하거나 초기화 작업을 수행합니다.3...

클래스란?

Java 클래스 정리1. 클래스의 정의클래스(Class)는 객체를 생성하기 위한 청사진(Template) 또는 설계도입니다.클래스는 속성(멤버 변수)과 동작(메서드)을 정의하며, 이들을 기반으로 객체를 생성합니다.2. 클래스의 구성 요소필드(Field): 객체의 속성을 나타내는 변수.클래스 내부에 선언된 변수로, 객체의 데이터를 저장합니다.예) String name, int age.메서드(Method): 객체가 수행할 동작(기능)을 정의.특정 작업을 수행하는 코드 블록.예) void run(), int getAge().생성자(Constructor):객체 생성 시 호출되는 특수한 메서드.클래스와 이름이 같고 반환 타입이 없음.객체 초기화에 사용.접근 제어자(Access Modifier):클래스 멤버(필드,..

추상 클래스

abstract는 Java에서 추상화(Abstraction)를 구현하는 데 사용되는 키워드로, 클래스 또는 메서드에 적용됩니다. 이를 통해 코드의 공통적인 구조를 정의하고, 세부적인 구현은 하위 클래스에서 처리하도록 강제할 수 있습니다. 아래에서 추상 클래스, 추상 메서드, 그리고 추상 변수에 대해 자세히 설명하겠습니다.1. 추상 클래스 (Abstract Class)1.1. 정의추상 클래스는 abstract 키워드로 선언된 클래스입니다.직접 객체를 생성할 수 없으며, 상속을 통해 자식 클래스가 이를 구현해야 합니다.공통된 동작과 구체적인 동작을 함께 정의할 수 있습니다.추상 클래스는 추상 메서드뿐만 아니라 일반 메서드도 포함할 수 있습니다.1.2. 특징인스턴스화 불가: 추상 클래스는 직접 객체를 생성할 ..

업캐스팅과 다운캐스팅 상태에서의 변수와 메서드 사용 가능 여부

1. 업캐스팅과 다운캐스팅 상태에서의 변수와 메서드 사용 가능 여부업캐스팅과 다운캐스팅 상태에서 변수, 메서드, 생성자, 오버라이딩 메서드의 사용 가능 여부는 참조 타입과 실제 객체 타입에 따라 결정됩니다. 이를 정리하면 다음과 같습니다:1. 변수와 메서드 사용 가능 여부업캐스팅 상태참조 타입이 부모 클래스이므로, 부모 클래스에 정의된 멤버만 사용할 수 있음.오버라이딩된 메서드는 참조 타입이 아닌 실제 객체 타입의 메서드가 호출됨(다형성).자식 클래스에 추가된 변수나 메서드는 접근 불가.예시class Parent { int x = 10; void show() { System.out.println("Parent Show"); }}class Child extends Parent ..

인스턴스 변수

인스턴스 변수인스턴스 변수(instance variable)는 객체(Object)마다 독립적으로 존재하는 변수입니다. 주로 클래스에서 정의되며, 특정 객체의 상태를 저장하는 데 사용됩니다. 다음은 인스턴스 변수의 주요 특징과 메모리 관련 동작에 대한 설명입니다:1. 선언과 저장 위치선언 위치: 클래스 내부, 메서드 외부에서 선언됩니다.저장 위치:객체가 생성되면, 인스턴스 변수는 힙(heap) 메모리 영역에 저장됩니다.각 객체는 독립적인 인스턴스 변수를 가지며, 같은 클래스로부터 생성된 다른 객체와 공유되지 않습니다.2. 메모리 할당 시점인스턴스 변수는 객체가 생성될 때 메모리에 할당됩니다.예를 들어, new 키워드를 통해 객체가 생성될 때 힙 메모리에 해당 객체와 관련된 인스턴스 변수가 함께 생성됩니다...

객체와 인스턴스 이해

객체(Object)의 개념객체(Object)는 프로그래밍에서 데이터와 그 데이터를 조작하는 메서드(동작)를 하나로 묶은 독립적인 단위입니다. 현실 세계의 사물이나 개념을 소프트웨어로 표현한 것으로, 상태(속성)와 행동(기능)을 가집니다. 객체 지향 프로그래밍(OOP, Object-Oriented Programming)의 핵심 요소 중 하나입니다.1. 객체의 구성 요소객체는 다음 두 가지로 구성됩니다:1) 속성 (Attributes)객체가 가지고 있는 데이터 또는 상태를 나타냅니다.클래스에서 정의된 변수(필드)에 해당합니다.예: 자동차 객체의 속성 → 색상, 속도, 모델명2) 행동 (Behaviors)객체가 할 수 있는 동작 또는 기능을 나타냅니다.클래스에서 정의된 메서드에 해당합니다.예: 자동차 객체의 ..

정적 클래스와 비정적 클래스 접근방식과 점 연산자

정적 클래스와 비정적 클래스static을 사용한 클래스와 사용하지 않은 클래스는 접근 방식에 차이가 있습니다. 아래에서 각각의 차이와 이유를 정리하겠습니다.1. 비정적 클래스 (Non-static Class)정의: static 키워드가 없는 클래스 또는 내부 클래스입니다.특징:외부 클래스의 인스턴스와 연결되어야만 사용할 수 있습니다.독립적으로 존재할 수 없으며, 반드시 외부 클래스의 객체를 통해 접근해야 합니다.비정적 멤버(필드/메서드)는 인스턴스별로 유지됩니다.예제class Outer { // 비정적 외부 클래스 class Inner { // 비정적 내부 클래스 void display() { System.out.println("Non-static Inner Clas..

업캐스팅(승급)

Left dao = new Left();동작:Left 클래스의 객체가 생성됩니다.참조 변수 dao는 생성된 Left 객체의 주소를 참조합니다.특징:참조 변수와 실제 객체의 타입이 동일합니다.모든 멤버(변수와 메서드)에 정상적으로 접근할 수 있습니다.Left dao = new Right();동작:Right 클래스의 객체가 생성됩니다.참조 변수 dao는 Left 타입으로 선언되었기 때문에, Right 객체를 업캐스팅하여 참조합니다.특징:상속 관계에서만 가능한 구문입니다.dao는 Left 타입으로 제한되기 때문에, Left 클래스에 정의된 멤버(변수와 메서드)에만 접근할 수 있습니다.Right 클래스에서 추가된 고유한 멤버에는 접근하려면 다운캐스팅이 필요합니다.예제:1. Left dao = new Left()..

toString()오버라이딩

1. toString()메서드 오버라이딩하는 이유toString() 메서드는 Java의 모든 객체가 기본적으로 가지고 있는 메서드이며, 객체를 사람이 읽기 좋은 문자열로 표현하기 위해 사용됩니다. 위 코드에서 toString() 메서드를 재정의하는 이유는 다음과 같습니다:1. 객체 상태를 출력하기 위해기본 toString() 메서드는 객체의 클래스 이름과 해시코드(메모리 주소)를 반환합니다. 이 정보는 일반적으로 이해하기 어렵고, 객체의 실제 데이터를 확인할 수 없습니다.따라서 toString() 메서드를 재정의하여, 객체의 속성 값들을 문자열로 반환하도록 하면 객체의 상태를 쉽게 확인할 수 있습니다.예:Board board = new Board();board.setSubject("Notice");boa..