☕️ Java 문법 종합반 (2) - ①클래스와 객체, 래퍼클래스, static, final, 인터페이스 / TIL - day 10

하리비·2025년 2월 26일
2

☕️ Java

목록 보기
5/8

▪️ 클래스와 객체


📖 클래스와 객체

📌 클래스란?

  • 객체를 만들때 필요한 청사진, 설계도
  • 첫글자는 무조건 대문자로 시작해야 한다

📌 객체란?

  • 실존하는 것
  • 클래스(설계도)가 있다면 여러 객체를 만들 수 있다 ➡︎ new 사용
  • 객체를 만드는 과정 = 인스턴스화

📖 클래스의 구조

📌 ① 속성(property, field)

  • 클래스(사람)이 가지고 있는 속성을 변수로 선언해줄 수 있다

    ✔️Class(Person)✔️Main
    변수(속성) 선언하기속성에 접근하기

📌 ② 생성자(constructor)

  • 조립 설명서이다

  • 기본 생성자
    - 원래는 생성자가 없으면 조립이 불가하지만, 기본 생성자가 존재
    - Person() {}
    - 새로운 생성자를 정의하면 기본 생성자는 사라진다

    💡 생성자의 특징

    1️⃣ 클래스와 이름이 같다
    2️⃣ 반환 타입이 존재하지 않는다.
    3️⃣ 여러개가 존재할 수 있다

    ✔️Class(Person)✔️Main

✔️ + ) this

  • 객체 자신을 가리킨다
  • 참조 변수 this를 통해 인스턴스 변수에 접근할 수 있다! 예시 다이어그램은 위 코드랑 다름

📌 ③ 기능(method)

  • 클래스와 관련된 기능을 만들 수 있다 ( 예시는 클래스가 사람이므로, 자기소개하기, 숫자 더하기 등등)
✔️Class(Person)✔️Main
선언호출

📖 게터와 세터

게터와 세터도 메서드의 일종이다 !

📌 게터(getter)

  • 클래스의 속성을 가져올 때 사용되는 기능 ➡︎ get을 붙이자

    ✔️Class(Person)✔️Main
    getName = 클래스에서this.name이라는 속성을 가져다주는 메서드➡︎ person A, B의 이름을 출력할 수 있게 된다

📌 세터(setter)

  • 속성을 외부(Main)에서 설정할 수 있다

    ✔️Class(Person)✔️Main


▪️ JVM 메모리 영역


📖 JVM 메모리 구조

📌 메서드 영역(Method)

  • like 도서관의 책장,, 저장된 파일
  • 프로그램이 실행되면 모든 파일(.java)이 올라간다 (실행 시점에 한번만 저장)
  • static 변수, 메서드들도 이곳에 저장된다 (static은 공통사용이므로)
  • 모든 객체가 공용으로 사용, 프로그램 전체에서 활용가능

📌 스택 영역(Stack)

  • 메서드가 호출되면 하나씩 쌓이고, 종료되면 사라진다
  • 호출된 메서드들이 접시쌓듯 쌓인다
  • 선입후출 - 나중에 쌓인 접시가 먼저 빠져 나간다 !
  • 지역변수들이 저장되는 공간 ➡︎ 객체의 주소값이 저장된다

📌 힙 영역(Heap)

  • new로 생성한 객체가 실제로 저장되는 공간
  • 실제로 stack에는 메모리의 주소가 저장되고, 힙을 참조하는 것
    (당연함 모든 객체는 참조변수를 통해 접근함)

💡 코드의 실행흐름을 눈으로 살펴보기


▪️ 래퍼클래스 (기본형, 참조형)


📖 래퍼클래스

  • 기본 자료형을 감싸고 있다 (래핑하고 있따)
  • 래퍼클래스 선언 ➡︎ 객체 생성과 같으나 생성자 생략 가능 ( 오토박싱 )
    • 객체이므로 참조형 변수지만, print 시 주소값이 아닌 실제 데이터가 바로 보이는 것 확인 가능
    • 그냥 int = a일 경우 데이터 그자체, 따로 기능이 없음
      근데 래퍼클래스 사용시 변수선언과 동시에 다양한 기능들을 활용가능 ( 하기한 toString 같은 메서드가 많다)
    • .toStirng() ➡︎ 클래스 Integer의 메서드 중 하나로 데이터를 문자열로 바로 변환해준다
✔️ 기본 자료형✔️ 래퍼 클래스
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

📖 참조형

  • 변수가 객체에 담기면 !
  • 데이터가 저장된 메모리 주소를 가리킨다 (실질 데이터 아님)

💡 오토박싱

기본형 ➡︎ 래퍼형 자동 변환

Integer num3 = 10; // ✅ 오토박싱

💡 오토 언박싱

래퍼형 ➡︎ 기본형 자동 변환

Integer num3 = 10; 
int num = num3;   // ✅ 오토 언박싱----> 참조형을 바로 int 타입에 담았는데도 오류가 없다 !

📖 static

  • 공용게시판 ➡︎ 모든 객체가 사용하는 변수나 메서드 / 모든 객체가 같은 값을 공유한다
  • 인스턴스화 시키지 않고 클래스 이름만으로 바로 사용
  • (원래 객체는 heap에 저장되지만) 메서드 에어리어에 저장
  • 프로그램 실행시 한번 생성된다
  • 공유할 수 있는 곳에 선언해야한다 ( 개별 속성에 하면 안댐 )

💡 인스턴스 멤버

  • 객체를 만들 때 생성되는변수메서드 ➡︎ 당연히 객체를 생성한 후에 사용가능
  • 인스턴스는 Heap Area에 저장

💡 클래스 멤버

  • 클래스 자체에 속해있는변수메서드
  • static을 사용한다
    • 공통 속성 / 공유해서 사용가능
    • 객체 생성 없이도 사용가능
  • Method Area에 저장 ➡︎ 메모리가 프로그램 시작부터 종료시까지 유지되므로 필요할 때만 사용

📖 final

📌 final의 용도

  • 1️⃣ final이 선언된 변수는 값을 변경할 수 없다
  • 2️⃣ final이 선언된 클래스는 상속할 수 없다
  • 3️⃣ final이 선언된 메서드는 오버라이딩 할 수 없다

일단 외우자 ..! final이 붙으면 변경, 상속, 오버라이딩 불가 ❌

📌 상수

  • 변하지 않고 항상 일정한 값을 갖는 수
  • 대문자로 표현하는 것이 관례
  • 변경되면 안되기 때문에 static final으로 선언
    ➡︎ 클래스 멤버이므로 객체 생성 불필요
  • 대표적인 예시 : 원주율

📌 불변객체

  • 내부 상태를 변경할 수 없는 객체
  • setter없이 설계한다 ( 변경할 수 없어야하므로 )
  • 변경이 필요할 경우 새로운 객체를 만들어야 한다
  • 예시 : String Integer 래퍼클래스

    불변객체 사용 예시

    • 클래스의 속성이 이렇게 선언되었을 때
    • 참조하고 있는 객체의 주소값은 변경 불가 / 내부는 변경가능
    • 올바르게 불변 객체를 만들려면 ? radius에도 final을 선언한다

💡 불변객체의 값을 변경하는 방법

  • 1️⃣ 생성자 활용

    ✔️ 클래스✔️ 메인
    변경하고자 하는 값으로 생성자를 만들고새 객체를 생성한다
  • 2️⃣ 메서드 활용

    ✔️ 클래스✔️ 메인
    속성을 변경 할 수 있는 기능을 새로 만든다기능을 활용해 속성을 변경한다

📖 인터페이스

  • 설계 표준
  • 클래스가 따라야할 최소한의 공통 규칙을 의미
    ➡︎ 일관성이 유지된다 , 각자의 고유한 특색도 확장할 수 있다
  • 예를 들어, 차량회사의 다양한 모델이 있다고 하더라도
    모든 차량은 주행하기, 멈추기, 시동걸기 등등,, 공통적으로 갖춰야할 기능이 있다

📌 인터페이스 활용하기

1️⃣ new ➡︎ interface 추가하기


2️⃣ 공통 규격을 작성한다 (따로 명령어는 작성안해도 된다)


3️⃣ 적용하기 implements

클래스로 와서 implements + 인터페이스 이름을 작성option + enter 후 적용하기

4️⃣ 클래스로 공통 규격이 불러와졌다 , 각 차량에서 기능을 만들어주면 된다

📌 인터페이스 다중 구현

  • implements 뒤에 여러 인터페이스를 입력하면 된다
  • 예를 들어 클래스가 동물일 때, 동물의 공통 규격 + 날아다니는 동물의 규격
    ( 대분류 소분류를 생각하면 될듯 )

📌 인터페이스에 변수를 선언하는 경우

  • 지금까지는 메서드를 사용했으나 변수도 선언할 수 있다 (권장하지 않음)
  • 인터페이스에 static과 함께 변수 선언하면 된다

0개의 댓글