20260108 [TIL] 8 - Java 객체지향 이해하기 (클래스와 객체, JVM 메모리 영역, 레퍼클래스, static, final, 인터페이스, 캡슐화, 상속, 추상화, 다형성)

2026. 1. 8. 12:24·IL/TIL

 

🚩 클래스와 객체 (getter, setter)

개념 파악

package chapter2.clazz;

public class Person {

    // 1. 속성 - 변수 선언으로 표현할 수 있습니다
    String name;
    int age;
    String address;

    // 2. 생성자
//    Person() {}
    // 1. 클래스와 이름이 같습니다.
    // 2. 반환 타입이 존재하지 않습니다
    // 3. 여러 개가 존재할 수 있습니다.
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 3. 기능(메서트 부분)
    int sum(int value1, int value2) {
        int result = value1 + value2;
        return result;
    }

    // 게터 - 속성을 가져오는 기능
    String getName() {
        return this.name;
    }

    // 세터 - 속성을 설정할 수 있는 기능
    void setAddress(String address) {
        this.address = address;
    }
}

 

package chapter2.clazz;

public class Main {

    public static void main(String[] args) {
        // 객체 생성(인스턴스화)
        ///  --- personA ---;
        ///  - name = "gygim"
        ///  - age = 20;
        ///  - address = XXXX
        Person personA = new Person("gygim", 20);
        Person personB = new Person("Steve", 15);

        // 속성에 직접 접근
//        System.out.println("설정 전 personA 이름: " + personA.name);
//        System.out.println("설정 전 personB 이름: " + personB.name);
//        personA.name = "gygin";
//        personB.name = "Steve";
//        System.out.println("설정 후 personA 이름: " + personA.name);
//        System.out.println("설정 후 personB 이름: " + personB.name);

        // 기능 활용
        int result1 = personA.sum(1, 2);
        int result2 = personB.sum(2, 4);
        System.out.println("result1 = " + result1);
        System.out.println("result2 = " + result2);

        // 게터 활용
        String name = personA.getName();
        System.out.println("name = " + name);

        // 세터 활용
        System.out.println("personA의 주소: " + personA.address);
        personA.setAddress("서울");
        System.out.println("personA의 주소: " + personA.address);
    }
}
  • 객체는 실제로 존재하는 것, 어떤 개념이나 논리 같은 것들도 객체가 될 수 있다
  • 객체를 만드는 과정을 인스턴스화라고 표현하며 new라는 키워드를 사용한다
  • 클래스 ㅡ 속성, 생성자, 기능(메서드) ㅡ 속생기

 

과제 실습

package chapter2.clazz;

public class Car {
    // 1. 속성
    String name;
    String carMode1;

    // 2. 생성자
    public Car(String name, String carMode1) {
        this.name = name;
        this.carMode1 = carMode1;
    }

    // 3. 기능
    public void drive() {
        System.out.println(name + "[" + this.carMode1 + "]을(를) 주행합니다 출바알~");
    }

    public void accelerate() {
        System.out.println(name + "[" + this.carMode1 + "]을(를) 가속합니다 부아아앙~");
    }
}
package chapter2.clazz;

public class CarMain {

    public static void main(String[] args) {

        // 자동차 객체 생성
        Car myCar = new Car("나의 자동차", "제네시스");
        myCar.drive();
        myCar.accelerate();

    }
}

 


🚩JVM 메모리 영역

`Method Area`

  • 프로그램 시작 시 정보가 저장
  • 클래스 정보(.class 파일)가 올라가는 곳.
  • 클래스의 메서드 정보, static 변수 등이 저장
  • 모든 객체가 공유하는 공용 공간

`Stack Area`

  • 가장 위에 있는 접시를 먼저 꺼내는 구조
  • 선입후출(LIFO) 구조, 먼저 들어온 것이 가장 늦게 나간다
  • 메서드가 호출될 때마다 새로운 접시 한 장(스택프레임)이 쌓인다
  • 가장 위에 있는 접시(최근 호출된 메서드)가 먼저 실행된다
  • 메서드 실행이 끝나면 스택에서 제거된다

`Heap Area`

  • new 키워드로 생성된 객체가 저장되는 곳
  • 객체의 실제 데이터가 저장되고 데이터의 주소는 `stack` 영역에 저장된다

코드 흐름 살펴보기

👉 Java Visualizer

이렇게 순서를 볼 수 있게 해 주는데 엄청 좋다..... 정처기 공부할 때 알았으면 좋았을 텐데


🚩 레퍼클래스(기본형 참조형)

기본 자료형 (Primitive Type) 래퍼 클래스 (Wrapper Class)
`byte` `Byte`
`short` `Short`
`int` `Integer`
`long` `Long`
`float` `Float`
`double` `Double`
`char` `Character`
`boolean` `Boolean`

 

참조형

package chapter2.wrapper;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        // 기본형 변수
        int a = 1;
        System.out.println("a = " + a);

        // 참조형 변수
        Person personA = new Person();
        System.out.println("personA = " + personA);
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println("arr = " + arr);

        // 래퍼클래스(기본형 변수를 감싸고 있는 클래스)
        // 참조형 변수입니다.
        Integer num = 100;
        System.out.println("num = " + num);
        String numStr = num.toString();

        // 직접 만들 래퍼 클래스
        CustomInteger myInteger = new CustomInteger(10);
        String myStrInteger = myInteger.toString();

        // 오토박싱 (기본형 -> 래퍼)
        Integer num3 = 10;
//        Integer num3 = Integer.valueOf(10);

        // 오토 언박싱
        int num4 = num3;
//        int num4 = num.intValue();

    }
}

 

래퍼클래스

  • 기본형은 객체처럼 속성, 기능을 가질 수 없다. 하지만 객체는 기능을 제공할 수 있다
  • 기본형을 감싼 객체를 만들어 기능을 제공하면 편리하게 데이터처리를 할 수 있다

 

오토박싱, 언박싱

  • '오토박싱' ㅡ 기본형 -> 래퍼형으로 변환하는 과정
  • '오토 언박싱' ㅡ 래퍼형 -> 기본형으로 변환하는 과정

 


🚩static - 클래스가 공유하는 공간

package chapter2.staticexample;

public class Person {

    // 인스턴스 변수
    String name;

    // static 변수
    static int population = 0;

    Person() {
        population++;
    }

    // 인스턴스 메서드
    void printName() {
        System.out.println("나의 이름은: " + this.name + "입니다.");
    }

    // static 메서드
    static void printPopulation() {
        System.out.println("현재 인구 수: " + population);
    }
}
package chapter2.staticexample;

public class Main {
    public static void main(String[] args) {
        
        // static 변수, 메서드 활용
        System.out.println("static 변수 활용: " + Person.population);
        Person.printPopulation();

        // 인스턴스 멤버 활용
        Person p1 = new Person();
        Person p2 = new Person();

        // 인스턴스 변수 활용
        p1.name = "gygim";
        p2.name = "Steve";

        // 인스턴스 메서드 활용
        p1.printName();
        p2.printName();

        Person.printPopulation();
    }
}
  • `static` 변수와 메모리는 프로그램이 종료될 때까지 메모리에 유지되기 때문에 너무 많이 남용하면 메모리 낭비가 됨

 


🚩 final -변하지 않는 값

package chapter2.finalexample;

public class Circle {

    // 속성
    final static double PI = 3.14159;
    final double radius;

    // 생성자
    Circle(double radius) {
        this.radius = radius;
    }

    // 기능
    Circle changeRadius(double newRadius) {
        return new Circle(newRadius);
    }
}
package chapter2.finalexample;

public class Main {

    public static void main(String[] args) {

        // final 활용 방법
        final int a = 1;
//        a = 2;
        System.out.println("a = " + a);

        // 상수 활용 방법
        System.out.println("상수 활용: " + Circle.PI);

        // 불변 객체 활용
        final Circle c1 = new Circle(2);
        // 참조 변경을 막지만 내부 상태 변경은 막지 않음
//        c1 = new Circle(5);
//        c1.radius = 5;
        System.out.println("c1 = " + c1);

        // 불변 객체의 내부 상태가 변경이 필요한 경우
        Circle c2 = new Circle(10); // 생성자
        Circle c3 = c2.changeRadius(20); // 기능을 활용
    }
}

 


🚩인터페이스 - 표준화의 시작

 


🚩 캡슐화(접근제어자)

 


🚩 상속

 


🚩 추상화

 


🚩다형성

 


⭐

저작자표시 비영리 (새창열림)

'IL > TIL' 카테고리의 다른 글

20260113 [TIL] 10 - Flowchart  (0) 2026.01.13
[TIL] - Java 계산기 과제  (0) 2026.01.12
20260107 [TIL] - 협업을 위한 git 활용 팀 과제  (0) 2026.01.06
20260105 [TIL] 5 - Java 기초 문법(변수, 입출력, 연산자, 조건문, 반복문, 배열, 메서드)  (0) 2026.01.05
20260102 [TIL] 4 - 웹개발 기초 과제(맛집 관리 API 설계하기)  (0) 2026.01.02
'IL/TIL' 카테고리의 다른 글
  • 20260113 [TIL] 10 - Flowchart
  • [TIL] - Java 계산기 과제
  • 20260107 [TIL] - 협업을 위한 git 활용 팀 과제
  • 20260105 [TIL] 5 - Java 기초 문법(변수, 입출력, 연산자, 조건문, 반복문, 배열, 메서드)
견지
견지
개발로 개발하는지 새발로 개발하는지 내가 개인 건지 새인 건지 사람인 건지
  • 견지
    개발새발
    견지
  • 전체
    오늘
    어제
    • 분류 전체보기 (20)
      • ... (0)
      • IL (20)
        • TIL (16)
        • WIL (4)
        • MIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    JSP
    JavaScript
    HTML
    java
    oracle
    git
    DB
    CSS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
견지
20260108 [TIL] 8 - Java 객체지향 이해하기 (클래스와 객체, JVM 메모리 영역, 레퍼클래스, static, final, 인터페이스, 캡슐화, 상속, 추상화, 다형성)
상단으로

티스토리툴바