반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

자바 클래스의 구조(필드부,생성자부,메소드부) 본문

JAVA

자바 클래스의 구조(필드부,생성자부,메소드부)

yeonee 여니 2023. 5. 8. 07:00
728x90
반응형
SMALL

안녕하세요.

#yeoneeblog 여니입니다:)

 

 

* 클래스의 구조

* public class 클래스명 {

*

* // 필드부

*

* // 생성자부

*

* // 메소드부

*

* }

*/

// 학생들은 추상화해서 만든 클래스

public class Student {

 

//[필드부]

//접근제한자 자료형 필드명;

 

//접근제한자 : 이 필드에 접근할수 있는 범위를 제한 할 수 있음.

// (public > protected > default > private)

// 클래스 영역 안에서 필드를 선언할때 반드시 접근제한자를 써 줘야한다.

public String name;

public int stdNo;

public double height;

}


 

* 1. 객체지향언어 : "객체"를 지향하는 언어로 "객체중심"으로 돌아간다.

*

* 2. 객체란 ? 사전적 의미로 현실세계에 존재하는 모든것을 의미함(유형 , 무형 , 개념, 사물)

*

* 3. 객체지향 프로그래밍 : 현실세계에서 독립적인 존재들인 객체들 간의 상호작용을 프로그래밍을 통해 가상세계로 구현하는 과정

*

* 4. 구현하고자 하는 프로그램 상의 필요한 객체를 만들기 위해서는 클래스라는 틀을 먼저 만들어줘야한다. (클래스란 ? 각 객체들의 속성(정보)들을 담아낼수 있는 그릇같은 존재, 어떻게 만듬? 1단계 추상화 + 2단계 캡슐화)

*

* 5. 추상화 과정 1) 내가 구현하고자 하는 프로그램에서 필요한 객체들을 생각해볼것 ex) 학생관리프로그램 => '학생'객체 :

* 홍길동학생, 김갑생학생, 민경민등등.. 2) 그 객체들이 가지고 있는 공통적인 속성, 기능들을 모두 추출할것 ex) 이름, 나이, 성별 ,

* 학년, 학번, 주소, 주민번호, 전화번호, 키 3) 그렇게 추출한 것들을가지고 내가 구현할 프로그램의 "실질적인 목적"에 맞춰 불필요한

* 속성, 기능들을 제거해서 추려나가기. 4) 최종적으로 추려진 속성들을 가지고 어떤 자료형에, 어떤 이름으로 사용할건지 생각해보기.

*

*

* 예) 학생관련 프로그램 1) 학생 관련 객체 (홍길동 학생, 민경민 학 생 , 이순신 학생 ...) 2) 공통적인 속성 및 기능(이름,

* 나이, 성별 , 학년, 학번, 주소, 주민번호, 전화번호, 키, 몸무게, 달리기 속도, 수면시간, 국어점수, 수학점수 체지방율 ,..)

* 3) 학생 "인적사항"을 관리하는 프로그램이다? 이름, 나이, 성별, 학년, 학번 , 주소, 전화번호 , 주민번호 학생 "성적"을 관리하는

* 프로그램이다? 이름,학번, 학년, 국어점수, 수학점수, 과학점수 학생 "건강"을 관리하는 프로그램이다? 이름,학번, 학년, 체지방율, 키,

* 몸무게 => 추려내는것이 핵심적인과정! 4) 최종적으로 추려진 데이터들을가지고 사용할 자료형 변수명짓기 : 이름, 학번, 키 라고 가정

* 이름 => String name; 학번 => int stdNo; 키 => double height;

*

* 6. 위에 선정한 것들을 가지고 본격적인 프로그래밍 시작 1) "변수"만으로 프로그래밍을 한다면?? 변수 : 하나의 자료형으로 하나의 값만

* 보관할수 있음. 홍길동이라는 객체를 만들기 위해서? String name1= "홍길동"; int stdNo1 = 20200315;

* double height1 = 180.5; 민견민이라는 객체를 만들기 위해서? String name2= "민경민"; int stdNo2 =

* 20230315; double height2 = 133.5;

*

* => 수백명의 학생을 관리하는 프로그램을 구현해야 할 경우, 변수가 수천개가 생길수가 있다. 관리하기가 굉장히 힘듬. 2) "배열"을

* 이용해서 프로그래밍을 하게 된다면?? 배열 : 동일한 자료형의 여러개의 값을 한번에 보관할수 있음. 학생의 이름을 보관하는 배열 =>

* String[] name = {"홍길동","민경민","이순신",..}; 학번을 보관하는 배열 => int[] stdNo = {2020,

* 202345, 20202012, ... }; 학생의 키를 보관하는 배열 => double[] height = {180.5, 199,

* 233.0, ...};

*

* 3) 그래서나온 개념이 구조체라는 개념 구조체: 한번에 여러개의 자료형을 보관할 수 있는 배열 같은 형태 String 값도 보관하고,

* int값도 보관하고 dobule, char, 그외 참조자료형... 나만의 배열같은 자료형을 만들수 있음. => 클래스 클래스 : 각

* 객체들의 속성정보(name, stdNo, height)담아낼수 있는 그릇(틀)과도 같은 존재 클래스를 보관할때 보관할 패키지명은

* vo(Value Object)

*/

 

public static void main(String[] args) {

 

//1. 변수만 가지고 프로그래밍하기

// String name1 = "김소연";

// int age1 = 50;

// double height = 170.9;

 

// 1. Student--> 학생객체를 뽑아내기위한 틀.(클래스)

// 홍길동 학생 객체 만들기

Student hong = new Student(); // 객체 생성(메모리 영역에 공간 할당)

// 각각의 필드에 직접적으로 접근해서 값 대입

hong.name = "홍길동";

hong.stdNo = 20230331;

hong.height = 199.4; // 필드, 메서드 접근시 . 으로 가져온다.

 

// 김소연 학생 객체 만들기

Student ksy = new Student();

ksy.name = "김소연";

ksy.stdNo = 20220303;

ksy.height = 180.5;

 

System.out.println(hong);

System.out.println(min);// full클래스명

 

// xxx님의 학번은 xxxxxx이고, 키는 xxxcm입니다.

System.out.printf("%s님의 학번은 %d이고, 키는 %.1fcm입니다. \n", hong.name , hong.stdNo, hong.height);

System.out.printf("%s님의 학번은 %d이고, 키는 %.1fcm입니다.", min.name , min.stdNo, min.height);

 

/*

* 필드를 public으로 작성시

* => 직접적으로 접근해서 값 대입 가능하고, 조회할 수 있는 경우 보안 문제가 발생할수 있다.

* => 외부에서 함부로 값을 변질시키거나, 조회권한이 없는 사람이 값을 쉽게 가져올수 있는 문제 발생

* => 값을 함부로 바꾸면 안되는데 , 변경될수가 있다.

*

* >>> 캡슐화로 해결

* 객체지향 설계 원칙중 하나. (정보은닉)

*/

 

}

 


 

//필드부

/*

* 필드 == 멤버변수 == 인스턴스 변수

*

* 접근제한자 [예약어] 자료형 필드명;

*/

private String name;

private int stdNo;

private double height;

 

//생성자부

 

//메소드부

/*

* 각 기능을 구현하는 부분

*

* 접근제한자 반환형 메소드명(매개변수 => 생략가능){

* // 실행할코드

* }

*

* setter 메소드

* 해당필드에 대입하고자 하는 값을 전달받아 해당필드에 대입시켜주는 기능의 메소드

* 이때 , 이 메소드는 접근 가능하도록 해야되기 때문에 접근제한자는 public을 이용

*/

 

// 이름(name)값을 기록 및 수정 할수 있는 기능의 메소드(name필드에 값을 대입해주는 용도)

public void setName(String name) {

// 매개변수 : 해당 메소드 호출시 전달되는 값을 받아주기 위한 변수 선언문(이 메소드 안에서만 사용가능)

 

// name = name; -> 필드명과 매개변수 명이 동일한 시점에서 {}영역 내에 해당 변수를 제시시 해당영역 안에서

// 생성된 변수가 우선순위가 더 높다

 

// this? 현재 생성된 객체의 주소값이 담겨있음.

this.name = name;

}

 

// 키(Height)값을 기록 및 수정 할 수 있는 기능의 메소드

public void setHeight(double height) {

 

this.height = height;

}

 

public void setStdNo(int stdNo) {

this.stdNo = stdNo;

}

 

// 데이터를 반환해주는 기능의 메소드 : getter 메소드

 

// name필드에 담긴 값을 돌려주는 용도의 메소드

public String getName() {

return name; // return 결과값; 결과값을 돌려주겠다.

}

 

// height값을 돌려주는 용도의 메소드

public double getHeight() {

return height;

}

// stdNo학번 필드에 담긴 값을 돌려주는 용도의 메소드

public int getStdNo() {

return stdNo;

}

 

// 모든 필드값을 하나의 문자열로 합쳐서 돌려주는 용도의 메소드

public String toString() {

return name +"님의 학번은"+stdNo+"이고, 키는 "+height+"입니다" ; // 결과값은 반드시 딱 "한개" 여야함.

}

}


* 7. 캡슐화 과정을 통해 완벽한 클래스의 형태를 갖추게 하기.

* 캡슐화란? 추상화를 통해 정의돈 속성들과 기능들을 하나로 묶어 관리하는 기법중 하나로

* 클래스에서의 가장 중요한 목적인 "데이터의 접근제한"을 원칙으로 외부로부터 "데이터의 접근을 막고"

* 대신에 '데이터를 간접적으로나마 처리(값을 대입, 값을 돌려줌)'할 메소드를 클래스 내부에 작성해서 관리하는 방식

*

* 캡슐화를 하지 않으면 : 외부로부터 직접접근이 가능하기 때문에 함부로 값이 변질되거나 조회를 막지 못하는 문제 발생

*

* 1) 정보은닉 : private

* 필드들을 외부로부터 직접 접근을 막기 위해 public 대신에 private 접근제한자 사용

* ex) 학생들이 본인의 성적을 함부로 바꿀수 없게

*

* ======================================================================

*

* 2) setter / getter 메소드

* 간접적으로나마 접근해서 값을 담거나(변경하거나) 그 값을 가져올수 있도록 도와줌.

*

*/

public static void main(String[] args) {

 

Student hong = new Student();

Student min = new Student();

//hong.name;

//hong.stdNo; The field Student is not visible

 

/*

* 위와 같이 대입할 경우 직접접근이 불가능해짐.

* 직접 접근을 막았다면 간접적으로나마 접글할수있는 메소드를 활용해야한다.

*/

 

//간접적으로 객체에 저장된 값을 수정할수 있게 도와주는 메소드 setter 호출

hong.setName("홍길동");

hong.setHeight(180.5);

hong.setStdNo(202303);

 

min.setName("민경민");

min.setHeight(190.5);

min.setStdNo(202303);

 

// 값을 불러올 경우 getter함수 이용

//System.out.println(min.name);

 

System.out.println(hong.getName());

System.out.println(hong.getHeight());

System.out.println(hong.getStdNo());

 

 

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

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

 

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

System.out.println(min);

}

728x90
반응형
LIST