초록꼬마의 devlog
article thumbnail

2021.10.25(월)

🌿 캡슐화

public class Run {    
    /* 캡슐화 과정을 통해 완벽한 클래스의 형태를 갖추게 하자
     * 캡슐화를 하지 않으면 외부로부터 직접 접근이 가능하기 때문에 함부로 값이 변질되거나 조회를 막지 못하는 문제가 발생
     * cf. 정보 보안 3요소: 기밀성, 무결성, 가용성
     * 
     * 캡슐화 작업 = 정보 은닉 기술 중 하나; 정보 보안의 기밀성과 무결성을 지킬 수 있게 함; 캡슐 안에 숨기는 것 -> 데이터의 접근 제한(<-접근제한자)을 원칙으로 해서 외부로부터 직접 접근을 막음;
     *               단, 대신, 메소드를 통해 간접적으로나마 처리(값 대입(setter), 조회(getter))를 할 수 있게 함
     * 
     * 캡슐화 작업의 2단계/공식(클래스 만들 때/설계 시 무조건 따라야 함 -> 외부에서 접근할 수 없도록)
     * 1. 값 숨기기: 멤버변수의 접근제한자 public 대신 private으로 바꿔서/사용해서 외부(다른 패키지)에서의 접근을 막음
     * 2. 클래스 외부에서 간접적으로 값을 처리할 수 있는 메소드(getter(값 가져오기), setter(값 대입))를 만듦
     */

    // 접근제한자 (예약어) 반환형 메소드이름(매개변수) { }
    // 매개변수 이름은 개발자 마음대로 할 수 있지만, 
    public static void main(String[] args) { // coding convention(관례, 개발자들끼리의 약속) = main함수의 매개변수 이름은 args로 하자

        // 객체 생성 = 인스턴스화 -> 객체 만들어진 것 = 인스턴스; 객체 생성은 반드시 main메소드에서만 할 수 있는 건 아님
        Student lee = new Student(); // new라는 키워드 및 해당 클래스의 생성자 사용 + 해당 클래스 import -> 참조(형)변수 lee에 Student(자료)형 객체의 주소 대입

        /* 캡슐화 단계1)
        lee.name = "김선민"; // 개인정보인데 누구나 와서 변경하면 보안 문제 vs 무분별한 수정을 막기 위해 private 멤버변수로 바꿔 설정하면 외부에서는 필드가 보이지 않아 오류 발생 -> 직접 접근 불가능함
        lee.age = 46;
        lee.gender = 'F';

        System.out.println(lee.name);
        System.out.println(lee.age);
        System.out.println(lee.gender);

        캡슐화 단계2) 직접 접근을 막았으니, 간접적으로나마 접근할 수 있게 해주기 <- get(얻기)ter /set(설정)ter 메소드 만들기
        */

        lee.setName("강토미 컴퓨터공학과"); // 괄호() 안에 적절한 자료형의 인자/매개변수/입력값 안 넣으면 오류
        lee.setAge(23);
        lee.setGender('F'); // 문자를 ''로 안 묶어주면 컴파일러에서 문자로 해석을 못함/변수로 생각함

//        lee.getName(); // 값을 반환만 받은 것; 어떻게 사용할지는 내 마음대로 정함
        System.out.println(lee.getName()); // print라는 함수/메소드 사용 시 함수의 매개변수로 괄호() 안에 argument(인자)를 넣음 -> 인자를 출력해달라 -> 반환받은 값을 출력해달라
        System.out.println(lee.getAge());
        System.out.println(lee.getGender());

        System.out.println(lee.information());

    }
}

🌿 클래스와 객체

public class Run {
    public static void main(String[] args) {        
        // Person이라는 클래스(=내가 만든 나만의/사용자 정의 자료형)를 통해/틀을 이용하여 객체 생성
        // 내가 만든 나만의/사용자 정의 자료형의 특징
        // 1. 참조자료형 -> 주소값을 저장; 크기는 4bytes
        // 2. 여러 개의 자료형의 값 및 기능을 보관 가능 -> 변수와 메소드의 집합

        // 인스턴스화 = 객체를 만듦; heap 영역의 메모리에 올림
        // 클래스명 객체/변수명 =(우항의 새로 만든 어떤 것을 대입) new연산자 클래스명과동일한메소드/(기본)생성자();
        Person kang = new Person();
        System.out.println(kang.information()); // 각 멤버변수에 값 대입하기 전에는 기본값이 들어있음 -> 기본(primitive)자료형은 0(.0), 공백; 참조형은 null

        // setter 이용하여 값 대입
        kang.setIdNum("850410-2******");
        kang.setName("강은영");
        kang.setAge(36);
        kang.setGender('F');
        kang.setMobile("010-1111-2222");
        kang.setEmail("greenkey20@naver.com");

        System.out.println(kang.information());
        System.out.println(kang); // 출력 결과 = 저장 경로 및 16진수로 표시된 주소값

        Product pd1 = new Product();

        pd1.setProductName("아이폰13");
        pd1.setPrice(1380000);

        System.out.println(pd1.information());

        pd1.setBrandName("삼성"); // 클래스 필드부 > 필드 선언 시 초기화해 준 값 변경 가능(setter 이용)
        System.out.println(pd1.information());
    }
}

🌿 변수의 종류

🌱 전역(global) 변수 = 인스턴스/멤버변수 + 클래스/static변수

  • field: 클래스를 구성하는 요소(필드+메소드) 중 하나; 클래스 내부이지만 메소드 밖 영역에 정의됨; 어떠한 데이터를 저장하기 위한 역할(변수
  • 전역변수: 클래스 영역에 바로 선언하는 변수; 단, public static 키워드를 붙여야 함 → 클래스 내(o)프로그램(x) 어디서나 (같은 의미로) 사용 가능
    • Java에서 전역변수는 존재하지 않음
  • 멤버변수/필드/인스턴스변수
    [생성 시점] new 키워드를 사용하여 해당 객체를 생성하는 순간 heap 메모리 영역에 할당됨
    [소멸 시점] 객체가 소멸될 때/reference count가 0이 될 때 -> garbage collector
    cf. 프로그램이 종료되기 전 객체 소멸 가능
  • 클래스/static 변수: 진짜 전역변수; static이라는 예약어가 붙은 변수
    [생성 시점] 프로그램 실행과 동시에 메모리의 static 영역에 들어감/할당됨; 해당 객체가 생성이 안 되어도 무조건 프로그램 실행과 동시에 할당이 됨
    cf. 프로그램 실행하면 main메소드를 실행하러 감
    [소멸 시점] 프로그램이 끝날 때

🌱 지역(local) 변수

  • 클래스 영역 내의 특정한 구역(중괄호{} code block 내; 메소드, for문 등)에서만 사용 가능
    [생성 시점] 특정한 구역{} 실행 시 stack 메모리 영역에 할당
    [소멸 시점] 특정한 구역{} 종료 시 소멸

 

클래스/static 변수 vs 상수 필드(static final)
// 클래스 변수(static 변수) 와 상수 필드(static final)에 대해!
public class FieldTest3 {	
	// static 필드
	//[표현법] 접근제한자 예약어(생략가능) 자료형 필드이름;	
	public static String sta = "static 변수";	
	// 생성시점 : 프로그램 실행과 동시에 메모리의 static 영역에 할당됨
	// 소멸시점 : 프로그램 종료시 소멸됨
	// => 객체를 생성하지않고 할당됨!
    
	// static "공유"의 개념이 강함!
	// 프로그램 실행과 동시에 메모리영역에 공간을 만들어두고 그 안의 값을 공유해서 쓰자!	
	/*
    
	 * 상수 필드 
	 * [표현법]
	 * public static final 자료형 상수필드이름 = 값;
	 * => 한번 지정된 값을 고정해서 쓴다. 그래서 무조건 초기화 해줘야함!
	 * => 예약어 순서는 상관없음 public final static으로 써도됨!
	 * 
	 * static : 공유의 개념 (재사용성)
	 * final : 한번 지정해놓고 변경하지 않겠다 (상수 언) 
	 * 
	 * 값이 변경되어서는 안되는 고정적인 값을 메모리상(static)에 올려놓고
	 * (프로그램이 시작과 동시에 메모리 영역에 할당, 값이 변하지도 않음)
	 * 공유할 목적으로 사용
	 * 
	 * 상수필드 이름도 항상 모두 대문자여야 다 
	 */	
	public static final int NUM = 10; 	
	/*
	 * 
	 * Math 클래스 random() 호출시 객체 생성x = Random()메소드가 static 메소드였기 때문
	 * Math 클래스의 PI상수 필드도 제공 
	 */
}

 

 

📗 소감

  • 추상적인 개념들이지만, 기본 정의와 구조를 명확히 파악해두자
  • 객체 지향 프로그래밍에서 캡슐화가 왜 필요한지 생각해보자
  • static 개념이 쉽지 않다. 메모리 구조를 더 공부하자