기초를 다잡기 위해 자바의 정석을
읽고 요약해보는 시간을 가져보려 한다.
(이번 글에서는 2, 5, 6과에 해당하는 요약이니 참고바랍니다)
JAVA의 정석(2ND EDITION) | 남궁성 - 교보문고
JAVA의 정석(2ND EDITION) | 자바의 기초부터 객체지향개념을 넘어 실전활용까지 자바의 참맛을 느낄 수 있는 교재『JAVA의 정석(2ND EDITION)』. 첫 째로 각 장마다 연습문제가 추가되어 학습한 내용을
product.kyobobook.co.kr
ch02 변수
- 변수 선언→ 변수 타입+이름 작성
- 변수 선언 이후 값 저장→ 변수의 초기화
- 변수 타입
- 기본형
→int, double 저장할 값의 종류에 따라 구분- 논리형(boolean(1)), 문자형(char(2)), 정수형, 실수형(float(4), double(8))
- 정수형(byte(1byte), short(2), int(4), long(8))의 경우, -2^(n-1) ~ 2^(n-1)-1 (n은 bit수)
- int는 -2^30~2^30 (-20억~20억)
- 참조형
→ String, Array, Object 값이 아닌 어떤 객체의 주소(메모리 주소)를 담을 것인가에 따른 객체의 종류에 의해 구분- 타입이 클래스이름인 것은 모두 참조 변수임
- + 참조형 변수 자체는 객체의 메모리 주소만 저장하고, 실제 객체(데이터)는 힙(Heap) 메모리에 저장됨.
- 형변환시 캐스트연산자 사용 → 값의 표현범위가 큰 자료형에서 작은 자료형 변환은 값 손실 가능성 있음
- 기본형과 참조형은 서로 형변환 불가
- 기본형
ch05 배열
- 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
- 참조형 배열 선언 및 초기화→ int[] score = new int[] {100,20,30,40} ;
- 2차원 배열은 int [][] score = {{122,100,100}, {20,20,40}}
- +String클래스는 char배열을 내부 데이터로 갖고 있으며 char배열을 다루는데 필요한 다양 메서드 제공
ch06 객체지향 프로그래밍 1
- 객체지향언어 큰 장점
- 코드의 높은 재사용성
- 관리 용이(변경 쉬움)
- 신뢰성 높은 프로그래밍 (데이터 보호→ 올바른 값 유지, 코드 중복 제거→ 오동작 방지)
- 객체 지향에 얽매여 고민하기 보단 기능적으로 완성시킨 다음 객체지향적으로 코드를 개선하는 방법을 고민하며 개선해가는 것이 좋음
클래스
- 객체를 정의해 놓은 것 → 객체 생성하는데 사용됨 (객체 지향 관점)
- 프로그래밍에서 객체란? 클래스에 정의된 내용대로 메모리에 생성된 것
- 객체와 인스턴스
- 클래스로부터 만들어진 객체→ 클래스의 인스턴스
- 구성요소
- 속성: 매개변수, 특성, 필드, 상태
- 기능: 메서드, 행위, 함수
- 인스턴스 생성과 사용
tv t; -> 참조변수 선언
t=new Tv(); -> 객체 생성 후, 객체 주소 참조변수에 저장
- 인스턴스의 멤버 변수를 사용하려면? 참조변수.멤버변수
- 둘 이상의 참조변수가 하나의 인스턴스를 참조하는 것은 가능하지만 하나의 참조변수로 여러 인스턴스를 가르키는 것은 불가능함
Tv t1=new Tv(); //0x100
Tv t2=new Tv(); //0x200
t2=t1; //둘이 하나의 인스턴스를 참조하게 됨 -> 참조변수없는 인스턴스(0x200)는 가비지컬랙터에 의해 자동으로 메모리에서 제거됨
t1.channel=7;
System.out.println(t1.channel); //7
System.out.println(t2.channel); //7
2. 데이터와 함수의 결합 (프로그래밍 관점)
- 서로 관련된 변수들을 정의하고 관련 작업을 수행하는 함수들을 함께 정의한 것
- String이 클래스인 이유
- 클래스 내부에는 value 문자열 배열을 선언하고 다양한 함수도 함께 정의해놓았음
(문자열 일부 뽑아내는 함수, 문자열 길이를 알아내는 함수 등) - 문자열 작업대상으로 이러한 작업들은 항상 필요하기에 함께 정의
- 클래스 내부에는 value 문자열 배열을 선언하고 다양한 함수도 함께 정의해놓았음
- 사용자정의 타입
- 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
- 제어자를 이용해 변수값은 직접 변경하지 않고 메서드를 통해서 값을 변경하도록 할 수 O
- 예를 들어, minute의 범위는 0~59 일때 이에 대한 제한 조건을 setMinute에서 걸 수 있음
변수와 메서드
- 선언위치에 따른 변수 종류 (p.166)
- 클래스 변수(공유변수, static 변수) : 클래스 영역 / 생성 시기: 메모리에 올라갈때
- 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성에 사용
- 인스턴스 변수: 클래스 영역 / 생성 시기: 인스턴스가 생성되었을 때
- 인스턴스마다 고유의 상태를 유지해야 하는 속성의 경우 사용
- 지역 변수: 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부) / 생성 시기: 변수 선언문이 실행될 때
- 클래스 변수(공유변수, static 변수) : 클래스 영역 / 생성 시기: 메모리에 올라갈때
- 메서드 → 코드 중복을 막기위함
- 하나의 메서드는 한 가지 기능만 수행하도록 작성
- 구조
- 선언부 → 리턴 타입, 메서드 이름, 매개변수
- 구현부
return문
- 메서드가 정상 종료되는 경우
- 메서드 블럭{} 끝까지 수행했을 때
- return문을 만났을 때
- 반환값이 없는 경우, return만 적고/ 반환값이 있다면 return + 반환값 입력
- 되도록 return문을 여러번 쓰기보다 리턴값을 저장했다가 한 번만 사용하는게 좋음
JVM의 메모리구조
- 메서드영역 ← 클래스 변수, 클래스에 대한 정보 저장됨
- 힙 ← 생성되는 인스턴스 모두 생성됨
- 호출스택 ← 지역변수, 중간결과 등 메소드를 호출하면 호출스택에 호출된 메서드를 위한 메모리가 할당
- 특징
- 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받음
- 수행마치면 메모리 반환, 스택에서 제거
- 호출스택 제일 위에 있는 메서드가 현재 실행 중일 메서드며 나머진 대기
- 특징
기본형 매개변수와 참조형 매개변수
- 기본형 매개변수- 변수 값을 읽기만 할 수 있다.
- 참조형 매개변수 - 변수 값을 읽고 변경할 수 있다.
- 배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근함
클래스메서드(static메서드)와 인스턴스메서드
- 클래스메서드: 객체 생성없이도 사용 가능한 함수
- 인스턴스 메서드: 객체를 생성해야만 사용 가능한 함수
- 인스턴스와 관계없는 메서드를 클래스(static) 메서드로 정의한다.
- 클래스의 멤버변수 중 모든 인스턴스에 공통 값을 유지해야 하는 것이 있으면 static 붙임
- 작성한 메서드 중 인스턴스 변수, 인스턴스 메서드를 사용하지 않는 메서드에 대해 static을 붙이는 것 고려
메서드 오버로딩(method overloading)
- 한 클래스에 같은 이름의 메서드를 여러 개 정의하는 것
- 조건
- 메서드 이름이 같아야 함
- 매개변수 개수, 타입 달라야 함
+리턴타입은 영향을 주지 않음
- 대표적인 예: println() → 어떤 타입이든 출력 가능함
생성자(Constructor)
- 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
- 인스턴스 초기화: 인스턴스 변수들을 초기화(적절한 값으로 저장)하는 것
- 조건
- 생성자는 리턴값이 없다.
- 클래스 이름과 같아야 한다.
- 매개변수가 없는 생성자, 있는 생성자 있음
- Card(), Card(String k, int num)
- 기본 생성자: 매개변수가 없는 기본 생성자
- 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 함
생성자에서 다른 생성자 호출하기 - this(), this
- 생성자 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 땐 반드시 첫 줄에서만 호출 가능하다.
- this → 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어 있음
- color =c; → this.color=color;
- this(매개변수) → 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
- Car() { color=”white”; door=4;} → Car(){ this(”white”, 4)}
생성자를 이용한 인스턴스의 복사
- 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스 하나 더 만들고자 할때 생성자 활용 가능
Car(Car c){ // Car클래스 참조변수를 매개변수로 선언한 생성자
color=c.color;
door=c.door;
}
- 같은 상태를 갖게 되어도 독립적으로 메모리 공간에 존재하는 별도의 인스턴스로 값 변경시 영향을 받진 않음
- Car c1= new Car();
- Car c2= new Car(c1);
변수의 초기화
- 변수를 선언하고 처음 값을 저장하는 것
- 멤버변수(클래스, 인스턴스 변수)는 배열의 초기화가 선택적이지만, 지역변수는 반드시 사용 전에 초기화를 해줘야 함
- 멤버변수 초기화 방법
- 명시적 초기화
- int doot=4; 기본형
- Engine e = new Engine(); 참조형
- 생성자
- 초기화 블럭
- 인스턴스 초기화 블럭
- 인스턴스 변수의 복잡한 초기화에 사용
- 클래스 내에 단순히 {} 을 만듦
- 클래스 초기화 블럭
- 클래스 변수의 복잡한 초기화에 사용 { //코드 작성 }
- 클래스 내에 {}를 만들고 static을 붙여줌 static { //코드 작성 }
- 공통적으로 사용해야 하는 코드의 경우 초기화 블럭에 넣어주면 중복 줄일 수 있음
- 인스턴스 초기화 블럭
- 명시적 초기화
- 멤버변수 초기화 시기와 순서
- 클래스 변수
- 초기화시점: 클래스가 처음 로딩될 때 한 번!
- 초기화 순서: 기본값 → 명시적 초기화 → 클래스 초기화 블럭
- 인스턴스변수 초기화시점
- 초기화시점: 인스턴스 생성될 때마다 각 인스턴스별로 초기화
- 초기화 순서: 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
- 클래스 변수
- 예제 코드( p.207 참고)
class Product{
static int count=0;
int serialNo;
{
++count; // product인스턴스 생성될 때마다 count 증가시켜 serialNo에 저장
serialNo=count; // 이때 serialNo는 인스턴스마다 초기화되므로 다른 인스턴스에 영향안주고 count만 공통
}
'자바' 카테고리의 다른 글
자바 실전개념편 3(상속, 다형성) (1) | 2024.06.02 |
---|---|
자바 실전개념편 2(접근 제어자~final) (0) | 2024.05.26 |
자바 실전개념편 1(클래스와 데이터 ~ 생성자) (0) | 2024.05.19 |
자바 입문하기_기본 개념 (변수~메소드) (0) | 2024.05.05 |