Java/Java 수강일지

[수강일지_13] , hiding, constructor,objectArray, work13 풀이,OOP 3대 특성

jamk-diary 2026. 5. 27. 16:47

Wrork 13  풀이 진행 

work 12 (260526)

내 풀이 public class Student { String name = "홍길동"; //이름 int ban = 1; //반 int no =1; //번호 int kor = 100; // 국어점수 int eng= 60; //영어 점수 int math = 76; //수학 점수 int gettotal = kor+eng+math; // 총점 double getAverage

jamk-diary.tistory.com



OOP 3대 특성 

 
 
캡슐화 (encapsulation)  -> 과거에는 은닉성(imformation hiding)이라고 불렀다 
- 클래스를 생성해서 묶어두는 것 
 
// TODO 은닉성? -> 외부에서 접근을 허용할까 말까를 결정해주는것
 
상속성 ( inheritance) 
 
다형성 (polymorphism)
 
캡슐화, 상속성, 다형석 -> 정석적인 표현
은닉성, 상속성, 다형성 -> 실용적인 표현 
 
은닉성 
 
접근지정자 
private(개인적인)
public(대중적인)
protected 
 
src (지역구)에 여러 패키지 (동네)만드는 방법 
-> src 눌러서 class 만들 때 패키지 이름 정해주기 

public -> 유튜브에 내용을 올려서 모두가 접근 할 수 있도록 해준다 
private  -> 계약서를 쓴 사람만 블로그에 올린  비공개 내용에 접근할 수 있도록 해준다. 
setter -> 외부에서 이름을 밖을 수 있도록 해준다 . 부평동 김씨를 서초동에서는 박씨라고 바꿔 부를 수 있다. 
getter -> 동네 밖에서 부를 수 있도록 만들어준다. 동네안에 김씨가 있는데 밖에서도 김씨를 부를 수 있다,
this -> 동명이인 부평동 김씨와 갈산동 김씨 동시 출몰 시 , 이건 부평사는 김씨야. 하고 알려줄 수 가 있다 

 
<Sample 36 프로젝트 ->  Sample 36 패키지  -> 메인 클래스>

package ssample36;

import MyCls.MyClass;

import cls.SampleClass;

import cls.ThisClass;

public class Mainclass {

 

public static void main(String[] args) {

// TODO 은닉성? -> 외부에서 접근을 허용할까 말까를 결정해주는것

 

MyClass cls = new MyClass();

 

// cls.number=1;

cls.name = " 홍길동";

// cls.metod() ;

 

SampleClass sc = new SampleClass();

 

int num = 123;

 

sc.setNumber(num);

 

int r=sc.getNumber();

System.out.println("r = " +r);

 

 

//This

ThisClass tc = new ThisClass();

 

System.out.println(tc); // -> ls.ThisClass@681a9515 출력하면 이렇게 나온다 이건 heap 영역의 주소이다

 

System.out.println(tc.getThis()); //System.out.println(tc.getThis()); ,System.out.println(tc) 이 주소는 같은 주소이다

 

}

 

 

}


   <Sample 36 프로젝트 -> MyCls 패키지  -> Myclass 클래스>

package MyCls;

 

 

public class MyClass {

 

//(멤버)변수인 경우 90% 이상 -> private 을 사용한다

private int number; // 클래스의 외부 접근을 차단하게 만든다 private -> 접근 지정자

public String name ; //누구나 접근을 가능하게 만든다 , 어느곳에서나 접근을 허용한다 public -> 접근 지정자

//public String name = "홍길동"; 이렇게 적으면 MainClass 에서 에러 해결

 

 

 

protected double height; // 상속후 알려주는 height

 

//함수 (멤버) 메소드인 경우 90% 이상이 -> public 을 사용한다

void method() {

 

}

 

 

 

}


<Sample 36 프로젝트 ->  Cls 패키지  -> Sample class 클래스>
 

package cls;

 

public class SampleClass {

 

private int number;

private String name;

private double height;

 

 

// setter, getter method 를 생성

// 외부에서 세팅을 하고 싶고 외부에서 값을 받고 싶을 때

 

//setter 함수 -> 외부에서 이름을 바꿀수가 있다

public void setNumber(int number) {

this.number = number;

}

 

// pub 만 누르고 컨트롤 스페이스 치면 위의 형식 나옴

//

// number = number; 에러는 안 나는데 이상하다

// 왜? int number 가 메개 변수이기 때문이다. 멤버변수랑 매게 변수랑 함께쓰이는 경우 매게 변수가 더 우선시 된다.

// 그래서 멤버 변수인 number = number;앞에 this. 를 붙인다

 

 

//getter 함수 // 밖에서 부를 수 있게 만들어 준다

//자동으로 만들기 메뉴 source 들어가서 제너레이티드 게터 앤드 세터 들어가기

//생성할 변수 선택 후 화살표 누르기 게터 세터 체크

 

public int getNumber() {

return number;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public double getHeight() {

return height;

}

 

public void setHeight(double height) {

this.height = height;

}

 

/*

여기서 return number; 앞에 this. 안 붙이는 이유 -> 부딛히는 게 없음

*/

}


 

< Sample 36 프로젝트 ->  Cls 패키지  ->  Thisclass 클래스>

package cls;

 

public class ThisClass {

 

/*

This 란 무엇일까?

this : 자기 자신의 주소 (heap 영역의 주소 ) = java 언어로는 reference(참조) 라고 한다

 

0번째 매개 변수로 모든 매소드에서 접근이 가능하다

*/

int number;

 

public ThisClass getThis() {

return this;

}

public void print( ) {

//number = 1;

this.number = 1;

 

}

public void setNumber () {

int number = 0; //local(지역) 변수

 

this.number = 12; // -> 멤버 변수에 값을 셋팅

number = 12 ; // -> 지역변수에 값을 셋팅

}

}

 

재미니의 개념 이해와 퀴즈 ! 

💡 1분 만에 이해하는 핵심 개념 요약

1. OOP의 3대 특성 (정석 vs 실용)

객체 지향 프로그래밍(OOP)은 프로그램을 만들 때 '객체(물건/레고 블록)' 단위로 나누어 조립하는 방식이에요.
  • 캡슐화 (Encapsulation): 관련 있는 데이터(변수)와 기능(메서드)을 하나의 클래스라는 '알약 캡슐'에 묶어 넣는 것 자체를 말해요.
  • 은닉성 (Information Hiding): 캡슐에 넣은 알약 성분 중, 외부에서 마음대로 바꾸면 안 되는 핵심 성분을 비공개(private)로 숨기는 방식을 뜻해요.
💡 정석적으로는 '캡슐화' 안에 '은닉성'이 포함되지만, 실무에서는 외부로부터 데이터를 숨긴다는 의미로 혼용해서 많이 씁니다.

2. 접근 지정자: public vs private

  • public (전체 공개): 유튜브 전체 공개 영상처럼, 어느 패키지(동네)에서나 누구나 접근하고 사용할 수 있게 해줘요. (대부분의 메서드/함수에 사용)
  • private (개인 비공개): 비밀 일기장처럼, 오직 해당 클래스 내부에서만 열어볼 수 있고 외부에서는 절대 볼 수 없게 막아요. (대부분의 멤버 변수에 사용)

3. Setter와 Getter (문지기 메서드)

변수를 private으로 숨겨놓으면 외부에서 값을 읽거나 쓰지 못하겠죠? 이때 안전하게 통로를 열어주는 문지기가 바로 GetterSetter입니다.
  • Setter (setNumber): 외부에서 값을 가져와서 내부 변수를 안전하게 변경(세팅)해 주는 역할. (예: "야, 이름 박씨로 개명해 줘!")
  • Getter (getNumber): 내부 변수의 값을 안전하게 꺼내서 외부로 전달(반환)해 주는 역할. (예: "저기요, 거기 안에 있는 김씨 이름 좀 알려주세요.")

4. this란 무엇인가?

동네에 동명이인(이름이 같은 사람)이 나타났을 때 누구인지 정확히 가리키는 손가락이에요.
  • 컴퓨터 메모리(Heap 영역)에 실제로 만들어진 '자기 자신(객체)의 주소'를 의미해요.
  • 메서드 안에서 매개변수(지역변수)와 클래스의 멤버변수의 이름이 똑같을 때, this.number라고 붙여주면 "이건 내(클래스) 방에 있는 멤버변수야!"라고 컴퓨터에게 확실하게 알려주는 역할을 합니다.

📝 개념 확인 퀴즈 10문항

정답은 종이나 메모장에 따로 적어가며 풀어보세요! (정답과 해설은 맨 아래에 있습니다.)

[O / X 문제]

Q1. 클래스를 생성해서 관련 있는 변수와 메서드를 하나로 묶어두는 것을 '상속성'이라고 한다. ( O / X ) Q2. 클래스의 멤버 변수는 외부의 무분별한 접근을 막기 위해 주로 private 접근 지정자를 사용한다. ( O / X ) Q3. private으로 선언된 변수는 같은 패키지 안에 있는 다른 클래스라면 자유롭게 접근할 수 있다. ( O / X ) Q4. Getter 메서드는 외부에서 보이지 않는 private 변수의 값을 외부로 꺼내올 때 사용한다. ( O / X )

[객관식 문제]

Q5. 다음 중 외부 클래스에서 접근하지 못하도록 클래스 내부의 데이터 접근을 차단하는 OOP의 실용적 표현은 무엇인가요? ① 상속성 ② 은닉성 ③ 다형성 ④ 가독성
Q6. 자바에서 this가 의미하는 것은 무엇인가요? ① 현재 실행 중인 프로그램의 전체 메모리 주소 ② 새로 생성할 다음 클래스의 이름 ③ Heap 영역에 생성된 객체 자기 자신의 주소 (참조) ④ 메서드가 종료된 후 돌아갈 목적지 주소
Q7. 다음 코드에서 this.number = number;를 사용하는 진짜 이유는 무엇인가요?

public void setNumber(int number) {
    this.number = number;
}

① this를 붙여야 변수가 새로 생성되기 때문 ② 매개변수 number와 클래스의 멤버변수 number를 구분하기 위해 ③ 에러를 무조건 방지해주는 자바의 필수 규칙이기 때문 ④ 메서드의 반환타입(return type)을 지정하기 위해
Q8. 자바에서 소스 코드를 작성할 때 여러 동네(패키지)를 나누어 관리하고 싶다면 보통 어떤 폴더 아래에 패키지를 생성하나요? ① bin 폴더 ② src 폴더 ③ lib 폴더 ④ target 폴더

[단답형/주관식 문제]

Q9. 외부에서 private 멤버 변수의 값을 안전하게 변경하거나 세팅할 수 있도록 도와주는 메서드의 이름을 통칭하여 무엇이라고 하나요? (영어 또는 한국어)
Q10. 다음 코드에서 printAddress()를 호출했을 때 출력되는 두 값의 관계는 어떠할까요?
Java
 
ThisClass tc = new ThisClass();
System.out.println(tc);
System.out.println(tc.getThis()); // 내부에서 return this;를 함

🔑 정답 및 해설

  • Q1. 정답: X
    • 해설: 변수와 메서드를 하나로 묶는 것은 '상속성'이 아니라 '캡슐화'입니다.
  • Q2. 정답: O
    • 해설: 데이터 오염을 막기 위해 변수의 90% 이상은 외부 접근을 차단하는 private을 씁니다. 아주 잘 이해하셨어요!
  • Q3. 정답: X
    • 해설: private은 패키지와 상관없이 오직 '자기 자신 클래스 내부'에서만 접근할 수 있습니다. 동네(패키지)가 같아도 클래스가 다르면 못 봐요!
  • Q4. 정답: O
    • 해설: 맞습니다. 문지기인 Getter를 통해서 안전하게 값만 읽어올 수 있습니다.
  • Q5. 정답: ② 은닉성
    • 해설: 외부 접근을 허용할까 말까 결정하고 숨기는 것은 은닉성(Information Hiding)입니다.
  • Q6. 정답: ③ Heap 영역에 생성된 객체 자기 자신의 주소 (참조)
    • 해설: this는 자바에서 메모리(Heap)에 올라간 진짜 '나 자신'의 주소표지판입니다.
  • Q7. 정답: ② 매개변수 number와 클래스의 멤버변수 number를 구분하기 위해
    • 해설: 이름이 같을 때는 갈산동 김씨(매개변수)가 우선순위를 가집니다. 그래서 부평동 김씨(멤버변수)를 가리키기 위해 this.를 붙여 구분합니다.
  • Q8. 정답: ② src 폴더
    • 해설: 소스코드가 담기는 src(source) 폴더 안에서 패키지를 생성하여 관리합니다.
  • Q9. 정답: Setter (세터 메서드)
    • 해설: 값을 세팅(설정)한다고 해서 Setter 메서드라고 부릅니다.
  • Q10. 정답: 두 주소값은 서로 '같다' (동일한 주소가 출력된다)
    • 해설: tc는 객체를 가리키는 변수이고, getThis()는 객체 내부에서 자기 자신의 주소(this)를 리턴하므로 결국 똑같은 Heap 영역의 주소가 나옵니다.

 

Sample37-constructor

constructor : 생성자

메소드 (함수)

Class 명과 같은 이름의 함수

Return 값이 없다

객체 생성 시에 자동 호출 된다 -> callback

다시 호출할 수 없다

초기화가 아니다 ( init 이 아니다) -> 기본값을 설정하도록 만든다

-> 파이썬에는 없다 -> init

Over Load 가 가능하다 : 함수명은 같은데 매개변수가 다른 동명이인 생성 가능

 

Destructor : 소멸자

: 현재는 사용하지 않는다

 

public class MainClass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

/*

constructor : 생성자 <- 초기값 설정용

메소드 (함수)

Class 명과 같은 이름의 함수

Return 값이 없다

객체 생성 시에 자동 호출 된다 -> callback

다시 호출할 수 없다

초기화가 아니다 ( init 이 아니다) -> 기본값을 설정하도록 만든다

-> 파이썬에는 없다 -> init

Over Load 가 가능하다 : 함수명은 같은데 매개변수가 다른 동명이인 생성 가능

 

Destructor : 소멸자

: 현재는 사용하지 않는다

 

 

*/

 

int number = 3; // 변수 선언과 동시에 초기화

 

int array[] = {1,2,3};

 

//SampleClass sample = { 1, "홍길동", 123.456 };

 

// SampleClass sc = new SampleClass();

 

// SampleClass scls = new SampleClass("성춘향");

 

SampleClass samcls = new SampleClass(33);

 

SampleClass ssm = new SampleClass("ddd");

 

}


SampleClass SampleClass()

SampleClass SampleClass(int number)

SampleClass SampleClass(string name)


 

 

 

 

public class SampleClass {

 

 

int number;

String name;

double height;

 

//default 생성자라고 부른다 = 아무것도 없는 생성자

public SampleClass() {

number=0;

name = "홍길동";

height = 172.1;

System.out.println("SampleClass SampleClass()");

}

 

public SampleClass(String name) {

this.name = name;

System.out.println("SampleClass SampleClass(string name)");

}

 

 

 

//외부에서 숫자는 입력을 받되 기본 생성자로 호출하고 싶은 경우

//즉, 생성자를 2개 호출하고 싶다 아래 방법 사용

 

public SampleClass(int number) {

this(); // 기본생성자를 호출하는 방법 항상 위에 있어야 한다

this.number = number;

System.out.println("SampleClass SampleClass(int number)");

}

/*

public SampleClass(int number) {

this("일지매"); // 기본생성자를 호출하는 방법

this.number = number;

System.out.println("SampleClass SampleClass(int name)");

}

이렇게 쓸 수도 있다

*/

// 소스 -> 커스트럭턴 유징들어가면 아래처럼 된다

public SampleClass(int number, String name, double height) {

super();

this.number = number;

this.name = name;

this.height = height;

}

 

 

 

}

 

 

}

 

내가 이해한 방향 

Sample Class 에서 

public SampleClass() {
number=0;
name = "홍길동";
height = 172.1;
System.out.println("SampleClass SampleClass()");
}

  public SampleClass()  괄호 안에 아무것도 없음=default라  이건 기본 생성자 =  this 가 된다 


public SampleClass(String name) {
this.name = name;
System.out.println("SampleClass SampleClass(string name )");
}


public SampleClass(String name)  쓰는 매개변수 name 과 Sample Class  에서 선언한 변수 중에 name 이있어서 겹칠 때this를 써서 이건 이 동네 변수라고 알려준다 
------------------------------------------------------------------------------------------------------------------------------------------------------------------
main class 와 같은 외부 클래스에서 숫자를 입력을 받고  sampleclass 에서 기본 생성자로 호출하고 싶은 경우
-> 생성자를 2개 호출하고 싶을 때 아래 방법을 사용한다  


public SampleClass(int number) {
this(); // 기본생성자를 호출하는 방법 항상 위에 있어야 한다
this.number = number;
System.out.println("SampleClass SampleClass(int number)");

이렇게 하면 main class  에서 
SampleClass samcls = new SampleClass(33); 입력후 출력했을 때 

SampleClass SampleClass()
SampleClass SampleClass(int number)


이렇게 호출 된다

/*
public SampleClass(int number) {
this("일지매"); // 기본생성자를 호출하는 방법
this.number = number;
System.out.println("SampleClass SampleClass(int name)");
}
이렇게 쓸 수도 있다
*/

---------------------------------------------------------------------------------------------------------------------------------------------------------------
name 이건 메인클래스 ddd 가 오는 곳 
그래서 name 은 ddd 가 되어다 


 

Sample38-objectArray

import java.util.Scanner;

 

import cls.Human; // 클래스 밖에 생성

 

public class Mainclass {

 

public static void main(String[] args) {

 

//홍길동과 성춘향 두 명의 데이터를 저장한 것

Human hu = new Human();

hu.setName("홍길동");

hu.setAge(24);

hu.setHeight(172.1);

 

System.out.println(hu.toString());

 

Human human = new Human ( " 성춘향 " , 15 ,156.3);

System.out.println(human.toString());

 

 

 

// 예제 - 5명의 데이터 입력받아서 저장하고 출력하시오

 

Scanner sc = new Scanner(System.in);

// 배열(변수)만 생성

Human humans[] = new Human[5];

// Human humans1, humans2, humans3;

 

for (int i = 0; i < humans.length; i++) {

System.out.print("이름 = ");

String name = sc.next();

 

System.out.print("나이 = ");

int age = sc.nextInt();

 

System.out.print("키 = ");

double height = sc.nextDouble();

 

humans[i] = new Human(name, age, height);

}

 

for (Human h : humans) {

System.out.println(h.toString());

}

 

 

 

 

}

}


Human [name=홍길동, age=24, height=172.1]

Human [name= 성춘향 , age=15, height=156.3]

이름 = 대추

나이 = 6

키 = 50

이름 = 미로

나이 = 6

키 = 40

이름 = 봉구

나이 = 9

키 = 100

이름 = 핑구

나이 = 65

키 = 156.3

이름 = 대구

나이 = 65

키 = 545

Human [name=대추, age=6, height=50.0]

Human [name=미로, age=6, height=40.0]

Human [name=봉구, age=9, height=100.0]

Human [name=핑구, age=65, height=156.3]

Human [name=대구, age=65, height=545.0]

 
 


public Human() {

 

}

 

//public Human() 입력하고 소스 -> 제너레이트 유징

public Human(String name, int age, double height) {

 

this.name = name;

this.age = age;

this.height = height;

}

 

//소스-> 제너레이트 투스티링

@Override

public String toString() {

return "Human [name=" + name + ", age=" + age + ", height=" + height + "]";

}

 

// 소스-> 제너레이트 게터 앤 세터

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

public double getHeight() {

return height;

}

 

public void setHeight(double height) {

this.height = height;

}

 

}

 

복습하면서 할것 

오늘 풀어본  예제 다시 풀기 
자바 연습 과제 풀기