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 변수의 복사본(주소)을 받는다. (같은 객체를 가리킴)
- 메소드 내부에서의 변경은 원본 소스에 영향을 미친다.
/* 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 타입 메소드
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
Boxing과 Unboxing
- Wrapper 클래스는 산술 연산을 위해 정의되지 않음. 따라서 값을 변경할 수 없다.
- Boxing: Primitive Data Type -> Wrapper class instance로 변환.
- Unboxing: Wrapper class instance -> Primitive Data Type으로 변환.
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 |