sussa
컴퓨터가 할 일은 컴퓨터가.
sussa
전체 방문자
오늘
어제

블로그 메뉴

    • 분류 전체보기 (58)
      • Language (58)
        • JAVA (58)

    공지사항

    인기 글

    태그

    • 조건문
    • Method
    • DI
    • 자료구조
    • 웹개발종합반
    • Instance
    • 재귀
    • Stream
    • 상속
    • singleton
    • 개발자
    • Til
    • recursion
    • 스파르타코딩클럽
    • tree
    • Web
    • CSS
    • spring
    • 최종연산
    • Algorithm
    • 다형성
    • BinarySearchTree
    • 캡슐화
    • Class
    • HTML
    • Thread
    • inheritance
    • Database
    • binaryTree
    • java

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    sussa

    컴퓨터가 할 일은 컴퓨터가.

    Java Object, Class, Instance_02 - OOP
    Language/JAVA

    Java Object, Class, Instance_02 - OOP

    2022. 9. 2. 23:50

    🎯 목표 

    • 과거 공부했던 객체 와 클래스의 내용을 복기하며 정확히 알지 못했던 내용과 애매했던 내용을 정리하고 정형화된 내용으로 다시 블로깅

    2022.08.15 - [Language/JAVA] - Java Object, Class, Instance

     

    Java Object, Class, Instance

    💻 Java Object(객체), Class, Instance 🎯 목표 : 클래스 타입의 객체를 만들어 인스턴스화 하는 과정의 기초를 이해 생활코딩 강의의 예제를 들어 작성 📒 객체, 클래스, 인스턴스의 기초 ❗ Object(객

    sussa1933.tistory.com

     

    📒 Class, Instance

     

    📌 Class 와 Instance

    • Class는 설계도 Instance (객체) 는 설계도로 만든 Product다
    • 객체는 필드와 멤버로 구성되어 있고, 변수와 메소드 그리고 내부클래스를 포함한 것들을 멤버라 한다.
    • 객체를 new연산자로 생성하게 되면 Heap 메모리 영역에 할당되며 참조변수는 할당된 주소를 참조하게 된다.

    📌 Variable(변수)

    • 변수의 종류에는 클래스 변수, 인스턴스 변수, 지역 변수가 있다.
    • 클래스 변수는 공통된 저장공간을 가지며 클래스명과 포인트 연산자( . )로 호출할수 있으며 새로운 객체의 참조변수로 호출할수도 있다.
    • 지역변수는 메소드를 호출할때 Stack 메모리에 저장되어 메소드가 동작이 끝나면서 해제되고 지역변수를 직접 초기화를 하지 않으면 에러가 발생한다.
    • 필드의 변수는 프로그램이 로딩될때 Static 메모리에 할당되며, 객체를 생성할때 Heap 메모리에 할당되면서 자동으로 초기화된다.
      Heap 메모리에는 빈공간이 저장될수 없어 할당될때 강제로 초기화하며, Stack 메모리는 메소드가 호출될때 임시적인 데이터로서 메모리에 할당되고 종료되면 메모리 할당이 해제되기 때문에 강제로 초기화 되어지지 않아 선언 후 초기화를 해야된다.
    • 객체를 생성하고 객체의 참조변수로 클래스 변수를 초기화 하게되면 모든 객체에서 클래스 변수의 값은 초기화 된다. 하지만 객체의 참조변수로 인스턴스 변수를 초기화 하게되면 다른 객체에서 인스턴스 변수의 값은 영향이 없다.

    Static, Stack, Heap

     

    👉 예제

    class TestData {
        String iv ; // 인스턴스 변수
        static String cv ; // 클래스 변수
    
        static void funcClass (TestData var){
            var.iv = "Instasce Var Change by Method";
        }
        void functInstance (TestData var){
            var.cv = "Class Var Change by Method";
        }
        void localVal (int localv){
            int localv;
    //        System.out.println(localv); 변수를 초기화 하지 않고 호출하게 되면 에러발생
        }
    }
    • TestData라는 클래스를 정의하였고 필드 변수 iv는 인스턴스 변수, cv는 클래스변수다.
    • 필드 메소드 funcClass는 클래스 메소드(static)로 Class TestData타입의 객체를 매개변수로 받아, 인자로 받은 객체의 인스턴스 변수의 값을 초기화 해주는 기능을 한다.
    • 필드 메소드 functInstance는 인스턴스 메소드로 Class TestData타입의 객체를 매개변수로 받아, 인자로 받은 객체의 클래스 변수의 값을 초기화 해주는 기능을 한다.
    • localVal 메소드는 지역변수 초기화 예를 들기위해 만들었다.
    • localVal 메소드 내부에 localv는 지역 변수고, 매소드 내부에서 초기화 되지 않은 변수(localv)에 접근하면 에러가 발생한다.
    • 위 예제 클래스로 클래스 변수(static), 인스턴스 변수, 클래스 메소드(static), 인스턴스 매소드가 어떻게 호출되는지 확인해본다.
    public class StaticMember {
        public static void main(String[] args) {
        // 인스턴스 변수의 초기화화 적용 범위에 대한 예제
            TestData me = new TestData(); // 객체1 선언
            TestData you = new TestData(); // 객체 2 선언
            
            System.out.println(me.iv); // 객체1 의 인스턴스 변수 출력
            me.iv = "Change me!!"; // 객체1 의 인스턴스 변수 초기화
            System.out.println(me.iv); // 객체1 의 변경된 인스턴스 변수 출력
            System.out.println(you.iv); // 객체2 의 인스턴스 변수 출력
        }
    
    }
    
    ===== 출력값 =====
     null
     Change me!!
     null
    • Instance(객체) me(객체1)와 you(객체2)를 선언하고 객체1 의 인스턴스 변수를 초기화 하였다.
    • 출력결과를 확인해보면 me.iv의 값은 변경되었으나 you.iv의 값은 변경되지 않았다.
    • 인스턴스 변수의 초기화는 다른 인스턴스의 변수에 영향이 없다는걸 확인할수 있다.

     

    public class StaticMember {
        public static void main(String[] args) {
        // 클래스 변수 초기화와 적용 범위에 대한 예제
            TestData me = new TestData(); // 객체1 선언
            TestData you = new TestData(); // 객체 2 선언
            
            System.out.println(me.cv); // 객체1 의 변경전 클래스 변수 출력
            me.cv = "Change me!!"; // 객체1 의 클래스 변수 초기화
            System.out.println(me.cv); // 객체1 의 변경후 클래스 변수 출력
            System.out.println(you.cv); // 객체 2의 클래스 변수 출력
        }
    
    }        
    
    ===== 출력값 =====
     null
     Change me!!
     Change me!!
    • 출력 결과를 확인해보면 me.cv의 값과 you.cv 값이 모두 변경된 것을 확인할수 있다.
    • 생성된 객체에서 클래스 변수의 초기화는 다른 객체의 클래스 변수에도 영향을 미친다는것을 알수 있다

     

    public class StaticMember {
        public static void main(String[] args) {
        // 클래스, 인스턴스 메소드의 접근 범위와 적용 범위에 대한 예제
            TestData me = new TestData(); // 객체1 선언
            TestData you = new TestData(); // 객체 2 선언
            
            me.funcClass(me); // 클래스 메소드를 통한 인스턴스 변수 초기화
            System.out.println(me.iv); // 객체1의 인스턴스 변수 출력
            me.functInstance(me);// 인스턴스 메소드를 통한 클래스 변수 초기화
            System.out.println(me.cv); // 객체1의 클래스 변수 출력
            
            System.out.println(you.iv); // 객체2 의 인스턴스 변수 출력
            System.out.println(you.cv); // 객체2 의 클래스 변수 출력
        }
    
    }
    
    ===== 출력값 =====
    Instasce Var Change by Method
    Class Var Change by Method
    null
    Class Var Change by Method
    • 객체1 의 참조변수로 클래스 메소드에 접근하였고 접근한 클래스 메소드는 다시 인스턴스 변수에 접근하여 값을 초기화 하였다.
    • 객체1 의 참조변수로 인스턴스 메소드에 접근하였고 접근한 인스턴스 메소드는 다시 클래스 변수에 접근하여 값을 초기화 하였다.
    • 당연한 개념이지만, 생성된 객체에서 인스턴스 메소드와 클래스 메소드에 접근할수 있으며, 메소드에서 인스턴스와 클래스 변수를 초기화 하여도 정상적으로 초기화가 된다는 것을 알수 있다.
    • 객체2 의 클래스 변수 출력 부분을 보면, 클래스 변수를 초기화 하면 다른 객체의 클래스 변수도 영향을 받는다는 것을 다시 한번 확인할수 있다.

    'Language > JAVA' 카테고리의 다른 글

    Java Generics  (0) 2022.09.03
    Java Memory Structure  (0) 2022.09.03
    Java Collection Framework 요약  (0) 2022.08.29
    Java Class Collections  (0) 2022.08.29
    Java HashMap (Interface Map)  (0) 2022.08.29
      'Language/JAVA' 카테고리의 다른 글
      • Java Generics
      • Java Memory Structure
      • Java Collection Framework 요약
      • Java Class Collections
      sussa
      sussa
      Efforts to take on a challenge

      티스토리툴바