Java

[Java] 08. 참조 타입

Joo.v7 2024. 8. 28. 19:15

Chapter 1: 참조 타입

  • 값 타입과 참조 타입 비교
  • 참조 타입 변수의 선언과 해제
  • 초기화되지 않은 참조 타입 변수
  • 값 타입의 비교와 참조 타입의 비교
  • 같은 객체에 대한 여러 변수의 참조
  • 메소드 파라미터에 참조 타입 사용

Chapter 2: enum 타입

  • enum 타입 선언
  • enum 값 비교
  • enum 타입 메소드
  • enum 생성자

Chapter 3: 공통 참조 타입

  • Exception 클래스
  • String 클래스
  • String 클래스 메소드, 연산자
  • String 값 비교
  • String 비교 연산자

Chapter 4: 객체 계층 구조

  • Object 타입
  • 공통 메소드

Chapter 5: Java 패키지

  • Java 패키지 개요
  • java.lang 패키지
  • java.util 패키지
  • java.io 패키지
  • 기타 유용한 패키지

Lab 8-1 참조 타입 변수를 선언하고 사용

Chapter 6: 타입 변환

  • Wrapper 클래스
  • Boxing과 Unboxing
  • 슈퍼 클래스 / 서브 클래스 변환
  • instanceof 연산자
  • Object 타입 변환
  • 인터페이스 타입 변환

Lab 8-2 타입 변환


Chapter 1: 참조 타입

값 타입과 참조 타입 비교

  • Value Type (값 타입)
    • 데이터를 직접 포함.
    • 복사된/직접 가지는 데이터를 저장.
    • Primitive Data Type: byte, short, char, int, long, float, double, boolean.
  • Reference Type (참조 타입)
    • 데이터(객체)가 있는 곳의 위치(주소)를 저장
    • 데이터는 분리된 메모리 영역()에 저장됨.
    • Java의 Primitive Data Type을 제외한 나머지(배열, 객체 등 ...)

 

참조 타입 변수의 선언과 해제

  • 참조 타입 변수 선언: BankAccount account; -> 참조 타입의 기본값인 "null"이 할당됨.
  • 참조 타입 변수 초기화: BankAccount account = account new BankAccount(); -> new 연산자 사용.
  • 참조 타입 변수 해제: account = null; -> 변수에 "null"을 명시적으로 할당.

 

값 타입의 비교와 참조 타입의 비교

  • Value Type의 비교: 관계 연산자(<, >, <=, >=)를 사용하여 을 비교.
  • Reference Type의 비교: 관계 연산자는 두 참조 타입 변수가 동일한 객체를 참조(주소)하는지 여부를 비교.
  • new 연산자는 heap(힙) 영역에 데이터를 바로 넣는다. 그리고 변수에 해당 영역의 주소를 준다. 따라서 아래의 코드에서 각각의 new 연산자들은 바로 힙 영역에 데이터(객체)를 넣고 이 주소를 변수에 줘서 내용에 관계없이 서로 다른 값(주소)이다.

BackAccount account1 = new BankAccount();
account1.accountNumber = 1;
account1.ownerName = “James”;

BackAccount account2 = new BankAccount();
account1.accountNumber = 1;
account1.ownerName = “James”;

if (account1 == account2)
    System.out.println("Same");
else
    System.out.println("Different"); // Different 출력

 

같은 객체에 대한 여러 변수의 참조

  • 하나의 객체에 대한 여러 변수의 참조: 두 참조 변수에서 읽기/쓰기는 같은 객체에 적용됨.

BankAccount account = new BankAccount();
account.accountNumber = 1;
account.ownerName = “James”;
BankAccount account2 = account;
System.out.println(account2.accountNumber); // 1
System.out.println(account2.ownerName); // James

 

메소드 파라미터에 참조 타입 사용

  • reference type의 변수를 메소드의 입/출력 parameter로 지정할 수 있다.
  • 입력 prametr로 사용시, 메소드는 reference type 변수의 복사본(주소)을 받는다. (같은 객체를 가리킴)
  • 메소드 내부에서의 변경은 원본 소스에 영향을 미친다.

Java는 무조건 Pass by value다. 따라서 참조 타입 변수의 값(주소)을 복사해서 메소드에게 준다.

/* newAccount, account, changedAccount
이 3가지 reference type 변수는 모두 같은 객체를 참조한다(가리킨다). */
static BankAccount changeName(BankAccount account) {
    account.ownerName = "Tom";
    return account;
}

BankAccount newAccount = new BankAccount();
newAccount.ownerName = "James";
BankAccount changedAccount = changeName(newAccount);

 

 


 

Chapter 2: enum 타입

enum 타입 선언

  • enum은 서로 연관된 상수들의 집합이다.
  • enum 타입은 몇 개의 열거 상수 (enumeration constant) 중 하나를 저장하는 데이터 타입.
  • 몇 가지로 한정된 값을 갖는 데이터. ex) 요일(월화수목금), 월(January...), 계절(Spring...) 등
/* enum 타입 선언 */
enum Suit {
    Spade,
    Diamond,
    Heart,
    Club
}

/* enum 타입 사용 */
Suit suit = Suit.Spade;

/* 클래스의 변수로 사용된 enum 타입 */
class PlayingCard {
    Suit suit; // 클래스의 변수로 사용.
    int Number;
}

class Test {
    public static void main(String[] args) {
        PlayingCard card = new PlayingCard();
        card.suit = Suit.Spade;
        card.number = 1;
    }
}

 

enum 값 비교

 

 * 참고

  • 리터럴(Literal)방식은 String pool에 객체가 생성되고, new 연산자 사용시 힙(Heap) 영역에 객체가 생성된다.
    ex) 리터럴 방식: String s2 = “abc”;  /  new 연산자를 이용: String s1 = new String(”abc”)
  • 참조 타입(reference type) 비교: "=="는 주소값을 비교. /  "equals()"는 주소가 가리키는 data를 비교.

2024.10.06 - [NHN Java 백엔드 8기/Java] - [Java] String, StringBuilder, StringBuffer

 

[Java] String, StringBuilder, StringBuffer

1. String불변성(Immutable)new 연산자 vs literal 방식2. StringBuilder와 StringBuffer공통점 - 가변성(Mutable)차이점 - 동기화(Synchronization)활용 시점1. String불변성 (Immutable)Java에서 String 객체는 값이 할당되면 이

lightningtech.tistory.com

 

    • enum 객체는 참조 타입으로 초기화되면 Heap 영역 메모리에 생성된다. (new 연산자 사용 X)
    • enum 객체 생성시, 모든 enum 변수는 생성된 enum 객체의 위치를 가리킴. (무조건 힙 메모리상에 하나만 존재)
    • enum은 무조건 메모리에 객체 하나만 존재하도록 한다. -> Singeton이다.
    • enum 값 비교: "==", "equals()" 는 같은 결과를 도출한다.(enum 변수는 모두 같은 enum 객체를 가리키므로)
      enum 간에는 >, <, <=, >= 등의 비교를 사용할 수 없다.
/* Singleton 예시 */
public class Singleton {
    private static Singleton singleton; // 클래스의 유일한 인스턴스를 저장할 정적 변수다.
    private int number;

    public synchronized int nextNumber() {
        return this.number++;
    }

    private Singleton() {}  // 클래스 이름과 똑같고 return type이 없는 것 : "생성자" 라는 메서드다.

    public static Singleton getSingleton() {    // 클래스의 유일한 인스턴스에 접근하는 방법을 가진 메서드.
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 

enum 타입 메소드

https://github.com/gikpreet/class-programming_with_java/blob/master/Module%2008%20%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85/contents/12_enum_method.adoc

 

class-programming_with_java/Module 08 참조타입/contents/12_enum_method.adoc at master · gikpreet/class-programming_with_jav

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

 

enum 생성자

  • enum의 각 열거형 상수에 추가 속성 부여
  • 생성자는 private
/* enum 선언 */
public enum Season {
    Spring("봄"),
    Summer("여름"),
    Fall("가을"),
    Winter("겨울");

    private String korName;

// 생성자를 private로 써서 enum Seasond은 메모리에 오직 하나만 존재
    private Season() {} 
    private Season(String korName) { 
        this.korName = korName;
    }

    public String getKorName() {
        return this.korName;
    }
}

/* Test 코드 */
public class Main {
    public static void main(String[] args) {
        Season season = Season.Spring;
        System.out.println(season.getKorName());  // 출력: 봄

	// Season season = Season.Summer("여름"); // 오류: 올바르지 않은 접근 방식

        season = Season.Summer;
        System.out.println(season.getKorName());  // 출력: 여름
    }
}

 

 


 

Chapter 3: 공통 참조 타입 - Exception, String

Exception 클래스

  • Exception은 클래스로 구현됨.
  • Exception 객체는 예외를 발생시키는데 사용됨.
    • new 연산자를 사용해서 Exception 객체 생성
    • throw 키워드를 사용해서 객체를 던짐
  • 모든 Exception 타입은 Exception 클래스에서 파생된 서브 클래스다.

 

String 클래스

  • 여러 개의 유니코드(Unicode) 데이터. 
  • 읽기만 하고, 변경할 수 없는 불변 클래스 (Immutable class)
  • 배열 형태로 access 할 수 없다.

 

String 클래스 메소드, 연산자

https://github.com/gikpreet/class-programming_with_java/blob/master/Module%2008%20%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85/contents/17_string_method_operator.adoc

 

class-programming_with_java/Module 08 참조타입/contents/17_string_method_operator.adoc at master · gikpreet/class-programmi

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

 

참고 코드)

2024.08.23 - [코딩 문제] - [코딩 문제] Anagram

 

[코딩 문제] Anagram

Anagram단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것. 문제 입력받은 두 문장이 Anagram인지 알려주는 코드를 작성하시오./* 1. 문자열을 char[]로 변경한다 -> toC

lightningtech.tistory.com

 

String 값 비교

  • equals(): String의 참조 위치(주소)가 아닌 주소가 가리키는 값을 비교.
  • compareTo(), compareToIgnoreCase()
    • 대소문자를 구분하여 비교.
    • 사전순 비교.
    • int 값 return.
/* equals() 메소드 */
// 같으면 true, 다르면 false
String s1 = "Hello";
String s2 = "Hello";

if (s1.equals(s2)) {
    System.out.println("same!");
}

/* compareTo() 메소드 - 대소문자 구분. */
// (1) 숫자를 return: 다른 문자가 발견될 경우.
// (2) 0을 return: 완전히 동일.
String s1 = "Yesterday";
String s2 = "Yeserday";
s1.compareTo(s2); // 15 return : 두 문자열에서 첫번째로 발견되는 다른 문자인 t - e 한 값을 return.

/* compareToIgnoreCase() 메소드 - compareTo()와 동일하게 동작하지만, 대소문자 구분 X */

 

String 비교 연산자

  • String 타입 객체 생성
    • 리터럴 사용: string constant pool 영역에 할당.
    • new 연산자 사용: heap 영역에 할당.

 

Chapter 4: 객체 계층 구조

Object 타입

  • java.lang.Object
  • 모든 클래스의 슈퍼 클래스.
  • 따라서 Java의 모든 클래스는 Object로 암시적 타입 변환이 가능.

 

공통 메소드

 모든 참조 타입 객체를 위한 공용 메소드

  • .toString(): 해당 instance에 대한 정보를 문자열로 반환. (항상 오버라이딩해서 사용해라)
  • .equals(): 해당 instance와 argument로 전달받은 두 객체의 값(실제 값)을 비교하여 결과를 반환.
  • .clone(): 해당 instance를 복제(deep copy)하여, 새로운 instance를 생성해서 return.
  • .finalize(): 해당 객체의 사용이 끝난 경우, Garbage Collector가 객체의 리소스를 정리할 것을 표시.

 


 

Chapter 5: Java 패키지

Java 패키지 개요

  • Java는 프로그래밍에 도움을 주는 Class Librarry를 제공.
  • package는 directory로 구성.
  • 코드의 시작 부분에 import문을 사용하여 사용할 패키지 명시.
    ex) import java.util.Scanner; import java.io.*;

 

java.lang 패키지

  • import문 없이 사용가능한 기본 패키지.
    • 모든 클래스의 기본이 되는 Object 클래스.
    • Wrapper - Integer, Long ... 등 Primitive type을 객체로 변환시킬 때 사용.
    • String, StringBuffer, StringBuilder 클래스.
    • 표준 입출력을 위한 System.in, System.out 스트림.
    • Thread 관련 주요 클래스.
    • 수학 관련 연산을 위한 Math 클래스.
    • 이외 등등...

 

java.util 패키지

  • Object 클래스의 보조 클래스인 Objects 클래스.
  • 날짜, 시간과 관련된 클래스.
  • 자료구조와 관련된 Collections Framework 관련 인터페이스와 클래스.
  • 이벤트 모델과 국제화 기능.
  • StringTokenizer, 난수 생성기.
  • Scanner 클래스 등 다양한 클래스와 인터페이스 포함.

 

java.io 패키지

  • 파일이나 통신 등 정보의 입출력을 처리하는 클래스가 포함된 패키지.
    • 파일 시스템의 파일 정보를 얻기 위한 File 클래스.
    • 콘솔에서 문자를 입출력하기 위한 Console 클래스.
    • InputStream, OutputStream 클래스 등 바이트 단위 입출력을 위한 스트림 추상 클래스.
    • FileInputStream, FileOutputStream등 바이트 단위 입출력을 위한 스트림 클래스.
    • Reader, Writer 등 문자 단위 입출력을 위한 스트림 추상 클래스.
    • FileReader, FileWriter 등 문자 단위 입출력을 위한 하위 스트림 클래스.
    • 그 외 입출력을 위한 다양한 클래스 포함.

2024.08.29 - [코딩 문제] - [코딩 문제] Text file 입출력

 

[코딩 문제] Text file 입출력

문제) 텍스트 파일의 이름을 main 함수의 argument로 받아서 파일의 내용을 요약해서 출력.터미널에서 java FileDetails Yesterday.txt 하면 txt파일을 넘겨주면서 실행한다. Text file/* Yesterday.txt */YesterdayYester

lightningtech.tistory.com

 

기타 유용한 패키지

  • java.net 패키지: 네트워크 응용 프로그램을 구현하기 위한 클래스를 제공.
  • javafx 패키지: Java 프로그래밍 언어로 데스크톱 응용 프로구램과 RIA를 개발하고 배포하기 위한 SW 플랫폼.

 

Lab 8-1 참조 타입 변수를 선언하고 사용

2024.08.27 - [코딩 문제] - [코딩 문제] 은행 계좌 문제

 

[코딩 문제] 은행 계좌 문제

문제 1) BankAccount 클래스 캡슐화 - private, getter/setter문제 2) 계좌 번호 생성문제 3) withDraw, deposit 메소드 추가+ 추가) 계좌 이체 메소드 transferFromimport java.math.*;import java.util.*;public class BankAccount { priva

lightningtech.tistory.com

 

 


 

Chapter 6: 타입 변환

Wrapper 클래스

  • Primitive Data Type을 객체로 취급해야 하는 경우에 사용.
  • 8개의 primitive Data Type에 해당하는 data를 객체(reference type)로 포장.
  • 각각의 타입에 해당하는 data를 argument로 해당 값을 가지는 객체로 생성.
  • Wrapper를 사용하면 기존 값의 변경이 아닌 새로운 값을 반환한다.
  • java.lang 패키지에 포함.
int primitiveTypeVariable = 1;
Integer wrapperType = new Integer(primitiveTypeVariable);
wrapperType.toString(); // 1

Primitive Data Type에 대응하는 Wrapper Class

 

Boxing과 Unboxing

  • Wrapper 클래스는 산술 연산을 위해 정의되지 않음. 따라서 값을 변경할 수 없다.
  • Boxing: Primitive Data Type -> Wrapper class instance로 변환.
  • Unboxing: Wrapper class instance -> Primitive Data Type으로 변환.

Boxing / Unboxing

Integer number = new Integer(20); // Boxing
int i = number.intValue(); // Unboxing

Integer number = 1; // Auto Boxing
int i = number; // Auto Unboxing

 

슈퍼 클래스 / 서브 클래스 변환 

  • Super class로 변환
    • 암시적(Implicit) / 명시적(Explicit) 모두 가능.
    • 언제나 변환에 성공.
    • Object는 최상위 클래스이므로, 모든 클래스는 Object로 변환 가능.
  • Sub class로 변환
    • 명시적(Explicit)으로 변환.
    • 올바른 타입으로 변환되는지 점검.
    • 변환되지 않을 경우 ClassCastException 발생.
class Animal { // Super class
    void eat() {}
}

class Bird extends Animal { // Sub class
    void fly() {}
}

/* Super class로 변환 */
Animal a;
Bird b = new Bird();
a = b; // 가능 (암시적 형변환)
a = (Animal)b; // 가능 (명시적 형변환)

/* Sub class로 변환 */
Bird b = (Bird)a; // 가능(명시적 형변환) 하지만 런타임에 타입 변환이 불가능하다면, ClassCastException 발생
Animal animal = new Animal();
Bird b = animal;	// 컴파일 오류 (암시적 형변환)

 

instanceof 연산자

  • 객체의 Type을 확인하는 데 사용 (변환 가능한 타입인지 확인)
  • 변환 가능하면 true를 반환
Hero hero;

if (h instanceof Hero) {
    hero = (Hero)ironMan;
}
else {
    System.out.println("Not a hero");
}

 

Object 타입 변환

  • Object는 모든 클래스의 기본 클래스. (모든 reference type은 Object 클래스를 상속한다)
  • 모든 reference type은 Object로 변환 (할당)가능.
IronMan ironMan = new IronMan();
Object object;
object = ironMan; // 암시적 할당
object = (Object)ironMan; // 명시적 할당

// ironMan은 Object의 instance냐?
ironMan instanceof Object; // true

 

인터페이스 타입 변환

  • 인터페이스는 인터페이스에 정의된 멤버에 access 하는 데만 사용.
  • 인터페이스는 파생된 클래스에 정의된 메소드 및 변수는 인터페이스를 통해 access 할 수 없다.

 

Lab 8-2 타입 변환

2024.08.30 - [코딩 문제] - [코딩 문제] 문자열 반전

 

[코딩 문제] 문자열 반전

문제) 입력받은 문자열을 반전된 문자열로 반환하는 메소드를 작성하시오. 코드String은 기본적으로 char 배열이다.public char charAt(int index)는 String의 index(0부터 시작)번째 위치의 값을 char로 return. 

lightningtech.tistory.com

 

2024.08.30 - [코딩 문제] - [코딩 문제] 텍스트 파일의 소문자 복사본 생성

 

[코딩 문제] 텍스트 파일의 소문자 복사본 생성

문제)텍스트 파일의 이름을 입력 받아 파일을 읽은 후, 읽은 파일의 모든 문자를 소문바로 변경한 복사본을 생성하는 프로그램을 작성하시오. 코드import java.io.*;import java.util.Scanner;public class CopyF

lightningtech.tistory.com

 

 


 

 

참조: https://github.com/gikpreet/class-programming_with_java/tree/master

 

GitHub - gikpreet/class-programming_with_java

Contribute to gikpreet/class-programming_with_java development by creating an account on GitHub.

github.com

 

2024.10.06 - [NHN Java 백엔드 8기/Java] - [Java] String, StringBuilder, StringBuffer

 

[Java] String, StringBuilder, StringBuffer

1. String불변성(Immutable)new 연산자 vs literal 방식2. StringBuilder와 StringBuffer공통점 - 가변성(Mutable)차이점 - 동기화(Synchronization)활용 시점1. String불변성 (Immutable)Java에서 String 객체는 값이 할당되면 이

lightningtech.tistory.com

 

https://deveric.tistory.com/123

 

[Java] 많이 헷갈려하는 String constant pool과 Runtime Constant pool, Class file constant pool

String Constant Pool과 Constant Pool 이 두 가지는 완전히 다른 개념입니다. 용어가 비슷한 형태이기 때문에 이 두 가지를 혼용하여 헷갈리는 경우가 많습니다만, 저장되는 위치부터 저장하는 데이터의

deveric.tistory.com

 

'Java' 카테고리의 다른 글

[Java] 09. 객체 생성과 제거  (0) 2024.08.30
[Java] Getter / Setter 메소드  (0) 2024.08.28
[Java] 07. 객체지향 프로그래밍 기본  (0) 2024.08.27
[Java] 06. 배열  (0) 2024.08.25
[Java] 배열의 출력, 비교, 복사, 정렬  (0) 2024.08.25