[1] 클래스
- 객체 지향 언어에서는 현실 세계를 반영하기 위해 객체(Object)라는 개념을 도입
- 현실 세계의 자동차, TV, 노트북 등이 객체 지향 언어에서는 객체로 표현됨
Class Car {
String a = "a";
int b = 1; // 객체가 가지는 데이터 정의
public void CarA() { // 연산(함수, 행동) 정의
System.out.println(a);
}
}
1) 클래스
- 객체를 생성하기 위해 그 객체가 어떤 데이터를 가지고 어떤 연산을 하는지에 대해 정의 (클래스 안에는 데이터가 있고, 이 데이터들을 활용하여 행동을 정의함)
- 자바에서는 모든 데이터를 객체로 취급하기 때문에, 클래스를 정의한 이후에 클래스를 통해 객체를 생성해야 함 (객체는 new라는 키워드를 사용해 메모리에 할당)
[2] 생성자
1) new라는 키워드를 가지고 객체를 생성할 때 ()를 쓰는 이유?
Car car = new Car();
- 클래스로부터 객체를 생성할 때 초기 데이터를 전달 해줄 수 있음 = 이게 바로 생성자
- 생성자는 객체가 생성될 때 처음 호출하는 메소드
- 생성자를 선언하지 않아도, 자동으로 default 생성자 자바가 정의해 줌(아무 기능을 하지 않는 생성자)
- 생성자는 매개 변수에 따라 여러 개가 정의될 수 있으며, public이라는 접근 제어자여야 함
[3] java.lang 패키지 (기본 클래스)
1) java.lang.*
- String, Integer와 같은 클래스들은 java.lang.* 패키지에 속해있음
- java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합
- 따라서 자바에서는 java.lang 패키지의 클래스들 import문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있음
2) 구조
- 부모 > 자식
- java.lang > Object > String/integer 등
3) Object 클래스
- 클래스의 최상위 클래스 (=모든 클래스는 Object 클래스로부터 상속 받음)
- 컴파일 과정에서 Object 클래스를 상속받는다는 뜻의 extends Object가 클래스 선언부에 자동으로 작성됨
- 클래스 생성 시 정의하지 않은 메소드들도 리스트에 나옴
- 모든 클래스는 Object 클래스의 메소드를 자동으로 상속받음
* 상속(Inheritance)
- 어떤 클래스의 변수와 메소드들을 물려받음 (상속을 쓰게 되면 코드의 재활용 + 유지보수가 쉬워짐) = extends 클래스명
4) Object 메서드
(1) toString()
- 객체 정보를 문자열(String)로 표현하여 반환
- 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환 가능 = 주소값 출력이 아니라 바로 정보를 출력하도록 할 수 있음
* Object 클래스의 toString()의 원형 : 클래스이름@해시코드 값
* 해시코드 : 해시 함수에 의해 자동으로 생성된 값, 객체를 유일하게 식별할 수 있는 정수 값
public String toString() {
return getClass(),getName() // 클래스 이름 출력 (Car)
+ "@" + Integer.toHexString(hashcode()); // 해시코드
} // 정의하여 원하는 문자열로 출력 가능
2. equals()
- equals() 메서드의 원래 기능은 두 인스턴스의 주소 값을 비교하여 boolean값(true, false)을 반환해주는 것
- 두 인스턴스의 주소 값이 같다면 당연히 같은 인스턴스
- 하지만 서로 다른 주소 값을 가질 때도 같은 인스턴스라고 정의할 수 있는 경우가 있음 (물리적 동일성 : 인스턴스의 메모리 주소가 같음) 뿐 아니라, 논리적 동일성 (논리적으로 두 인스턴스가 같음)을 정의할 때도 equals() 메서드를 재정의하여 사용 (equals() 메서드의 원래 기능은 두 인스턴스의 주소를 비교하는 걸로, 동일한 주소여야만 true 됨)
- 재정의(오버라이딩)하여 두 인스턴스의 물리적(주소 값), 논리적으로 동일한지 true / false값을 반환하도록 변경 가능
3. int hashCode()
- 해시코드 : 해시 알고리즘에 의해 생성된 정수 값
- 해시 테이블은 객체의 주소 값 or 객체의 정보를 키 값(input값)으로 해시 값(출력 값)을 계산 = 해시 함수는 객체의 특정 정보(키 값)를 매개변수 값으로 넣으면 그 객체가 저장되어야 할 위치나 저장된 해시 테이블 주소(위치)를 반환
* 두 객체가 동일한지를 판단하는 equals()의 결과값이 true라면 두 객체는 동일한 객체이므로 해시 값도 일치해야 함 (equals와 hash code는 동시에 사용하는 경우가 많다)
5) String 클래스
(1) 스트링 선언 방법
* 이미 생성된 문자열 상수를 가리키는 방식
- String a = "안녕"; // heap 영역의 문자열 상수풀에 저장됨(a가 이미 기존에 만들어져 있던 "안녕"이라는 문자열 상수의 메모리 주소를 가리키게 됨
* 문자열을 생성자의 매개변수로 하여 생성하는 방식
- String a = new String("안녕"); // heap 영역에 새롭게 생성 되어짐("안녕" 문자열을 위한 메모리가 할당되고, 새로운 객체가 생성됨)
= 리터럴(변하지 않는 값)과 객체의 내용은 똑같아도 주소값은 다름
(2) final char[] 변수
- 다른 프로그래밍 언어는 문자열을 구현할 때 일반적으로 char[] 배열을 사용
- 자바는 String 클래스를 제공해 char[] 배열을 직접 구현하지 않고도 편리하게 문자열 사용 가능
- String 클래스의 구현 내용에 'private final char value[]' 라고 선언된 char[] 배열이 있음
- final 값 변경 불가이므로, 한 번 생성된 문자열은 변경되지 않음 (= immutable)
- String 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경 불가(불변 객체 [immutable object]
- (+) 연산자를 이용하여 문자열 결합을 하면, 기존 문자열의 내용이 변경되는 게 아니라 새로운 String 인스턴스를 생성 (결과적으로 자원의 낭비가 발생하기 때문에 gc(garbege collector)가 참조되지 않는 변수 없애줌)
(3) StringBuffer와 StringBuilder 클래스
- 프로그램을 만들다 보면 문자열을 변경하거나 연결해야 할 때가 많음
- String class는 한 번 생성되면 그 내부의 문자열이 변경되지 않기 때문에 String 클래스를 시용히여 문자열을 계속 연결하거나 변경하는 프로그램을 작성하면 메모리 낭비가 심해짐
- 이를 해결하는 게 바로 StringBuffer와 StringBuilder 클래스
* StringBuffer와 StringBulider는 내부에 변경 가능한(final 아닌) char[]를 변수로 가지고 있음
- 이 두 클래스를 사용하여 문자열을 연결하면 기존에 사용하던 char[] 배열이 확장되므로 추가 메모리를 사용하지 않음
- 두 클래스의 차이는여러 작업(스레드)이 동시에 문자열을 변경하려고 할 때 문자열에 안전하게 변경되도록 보장해주는지의 차이 (StringBuffer 클래스는 문자열이 안전하게 변경되도록 보장 + StringBuilder 클래스는 보장 X(StringBuilder가 실행속도 더 빠름)
(4) String 메서드
- length(), contains(), toUpperCase(), toLowerCase(), trim(), CharAt(), indexOf(), split(), subString(), replace(), concat()
(5) Wrapper 클래스 (래퍼 클래스)
- 말 그대로 기본 타입에 해당하는 값을 클래스 형태로 포장하여 객체화 시키는 것 (기본 자료형처럼 사용할 수 있는 클래스)
int a = 10; (리터럴 클래스, 기본 타입) : int 기본 자료형의 래퍼 클래스는 Integer / char은 Character, float는 Float
Integer a = new Integer(10); (Wrapper 클래스, 참조형 데이터 타입으로 만들기 위해)
* int는 기본 자료형으로 4 바이트, Interger의 경우 클래스이기 때문에 인스턴스로 생성하려면 생성자를 호출하고 정수 값을 인수로 넣어야 함!
- 기본 타입 -> Wrapper 클래스(객체형) (박싱, Boxing)
- 기본 타입 <- Wrapper 클래스(객체형) (언박싱, UnBoxing)
'이론 공부' 카테고리의 다른 글
Getter / Setter 사용 이유 (0) | 2023.03.21 |
---|---|
자바 이론 정리 1 (0) | 2023.03.21 |
아키텍처(Architecture) (0) | 2023.03.20 |
개발 방법론 (0) | 2023.03.14 |
GET / POST 방식 (0) | 2023.03.12 |