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 개념이 쉽지 않다. 메모리 구조를 더 공부하자
'back-end dev > Java' 카테고리의 다른 글
[KH정보교육원] 12일차_상속 (0) | 2021.11.07 |
---|---|
[KH정보교육원] 11일차_클래스, 객체 배열 (0) | 2021.11.07 |
[KH정보교육원] 9일차_배열 복사, 객체 (0) | 2021.11.07 |
[KH정보교육원] 8일차_배열 (0) | 2021.11.07 |
[KH정보교육원] 7일차_반복문, 분기문 (0) | 2021.11.07 |