본문 바로가기
자바

[자바의 정석] 변수, 배열, 객체 지향 파트 요약 정리 (챕터2, 5, 6 정리)

by 더하리 2025. 3. 16.

 

기초를 다잡기 위해 자바의 정석을 

읽고 요약해보는 시간을 가져보려 한다.

 

(이번 글에서는 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 

  • 객체지향언어 큰 장점
    • 코드의 높은 재사용성
    • 관리 용이(변경 쉬움)
    • 신뢰성 높은 프로그래밍 (데이터 보호→ 올바른 값 유지, 코드 중복 제거→ 오동작 방지)
  • 객체 지향에 얽매여 고민하기 보단 기능적으로 완성시킨 다음 객체지향적으로 코드를 개선하는 방법을 고민하며 개선해가는 것이 좋음

클래스

  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 문자열 배열을 선언하고 다양한 함수도 함께 정의해놓았음
      (문자열 일부 뽑아내는 함수, 문자열 길이를 알아내는 함수 등)
    • 문자열 작업대상으로 이러한 작업들은 항상 필요하기에 함께 정의
  1. 사용자정의 타입
  • 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
  • 제어자를 이용해 변수값은 직접 변경하지 않고 메서드를 통해서 값을 변경하도록 할 수 O
    • 예를 들어, minute의 범위는 0~59 일때 이에 대한 제한 조건을 setMinute에서 걸 수 있음

변수와 메서드

  • 선언위치에 따른 변수 종류 (p.166)
    • 클래스 변수(공유변수, static 변수) : 클래스 영역 / 생성 시기: 메모리에 올라갈때
      • 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성에 사용
    • 인스턴스 변수: 클래스 영역 / 생성 시기: 인스턴스가 생성되었을 때
      • 인스턴스마다 고유의 상태를 유지해야 하는 속성의 경우 사용
    • 지역 변수: 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부) / 생성 시기: 변수 선언문이 실행될 때
  • 메서드 → 코드 중복을 막기위함
    • 하나의 메서드는 한 가지 기능만 수행하도록 작성
    • 구조
      • 선언부 → 리턴 타입, 메서드 이름, 매개변수
      • 구현부

return문

  • 메서드가 정상 종료되는 경우
    • 메서드 블럭{} 끝까지 수행했을 때
    • return문을 만났을 때
      • 반환값이 없는 경우, return만 적고/ 반환값이 있다면 return + 반환값 입력
  • 되도록 return문을 여러번 쓰기보다 리턴값을 저장했다가 한 번만 사용하는게 좋음

JVM의 메모리구조

메모리 구조 (출처: https://www.codelatte.io/courses/java_programming_basic/KUYNAB4TEI5KNSJV)

  • 메서드영역 ← 클래스 변수, 클래스에 대한 정보 저장됨
  • 힙 ← 생성되는 인스턴스 모두 생성됨
  • 호출스택 ← 지역변수, 중간결과 등 메소드를 호출하면 호출스택에 호출된 메서드를 위한 메모리가 할당
    • 특징
      • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받음
      • 수행마치면 메모리 반환, 스택에서 제거
      • 호출스택 제일 위에 있는 메서드가 현재 실행 중일 메서드며 나머진 대기

기본형 매개변수와 참조형 매개변수

  • 기본형 매개변수- 변수 값을 읽기만 할 수 있다.
  • 참조형 매개변수 - 변수 값을 읽고 변경할 수 있다.
    • 배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근함

클래스메서드(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만 공통
	}