국비/Java

[08] Java 객체 - 캡슐화(encapsulation), 필드(field), 메소드(method)

박머루 2022. 4. 18. 19:38
캡슐화
public class Student {

[필드부]
 * 정보를 담는 부분
 * 필드 == 멤버변수 == 클래스변수
 * 접근제한자 자료형 필드이름;

// 정보를 담을 수 있는 변수 선언 + private => 캡슐화
private String name;
private int age;
private char gender;


// 생성자부
- 아직 안배움-

// 메소드부

 * 기능을 구현하는 부분

   접근제한자 반환형 메소드식별자(매개변수) {
       메소드를 호출하면 실행할 코드;
      }
 
 * public   접근제한자 : 메소드를 호출할 수 있는 범위를 제한해준다.
 
 * void     반환형 : 메소드의 결과값의 자료형을 지정해준다
   void -> 돌려줄 값이 없다. 돌려줄 값이 있다면 돌려줄 값의 형태를 적어줌!! (자료형)
 
 * () 매개변수 : 메소드 호출 시 입력값으로 넣어주는 변수. 해당 메소드 실행중에만 사용 가능한 변수. 생략 가능
  
 * method() 메소드식별자()

// 데이터를 기록 및 수정하는 기능의 메소드 ㅣ setter 메소드

 * 규칙
 1. setter 메소드는 접근 가능하도록 만들어야 하기 때문에 public 접근 제한자를 이용
 2. set필드명 으로 이름 짓되 낙타봉표기법(camelCase)을 지키도록 한다.
    ex) setName, setAge, setGender
 3. 모든 필드에 대해서 전부 다 반드시!!! 작성을 해줘야 한다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1☆☆☆


// 이름을 기록 및 수정할 수 있는 메소드
public void setName(String name) {
this.name = name;

//특정 영역 안에서는 해당 영역 안에 있는 지역변수 우선권이 있음
// this.를 붙이지 않으면 매개변수 name = 매개변수 name 이렇게 인식이 됨!!
}

public void setAge(int age) {
this.age = age;
}
public void setGender(char gender) {
this.gender = gender;
}

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


 * 1. getter메소드는 접근제한자 public을 사용한다.
 * 2. get필드명으로 짓되, 낙타봉표기법(camelCase)를 사용한다
 *  ex) getName, getAge, getGender
 * 3. 모든 필드에 대해서 다 작성해줘야한다!!! 반드시!!!!!!!!!!


// 이름을 반환해주는 메소드
public String getName() {
return this.name;
// return 결과값 => 결과값을 돌려주겠다
}
// 나이를 반환해주는 메소드
public int getAge() {
return this.age;
}
// 성별을 반환해주는 메소드
public char getGender() {
return this.gender;
}

// setter와 getter 메소드 다 만들어주면 캡슐화 끝!!!!!!

//메소드 정리
public String information() {

// return this.name, this.age, this.gender;
// 결과값은 return당 한개여야한다!!
return this.name + "님의 나이는 " + age + "살이고,성별은 " + gender + "입니다.";

}
public class Person {
	
	// 사람의 인적 정보
	// 주민번호, 이름, 나이, 성별, 휴대폰번호, 이메일주소
	
	// [필드부]
	// 필드 == 멤버변수 == 클래스변수 == 인스턴스변수
	
	private String name;
	private String personId;
	private int age;
	private char gender;
	private String phone;
	private String tiStory;
	
	
	//[생성자부]
	
	//[메소드부]
    
	// setter 메소드들 : set필드명
	public void setName(String name) {
		this.name = name;
	}
	public void setPersonId(String personId) {
		this.personId = personId;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public void setTistory(String tiStory) {
		this.tiStory = tiStory;
	}
	
    
	// getter 메소드 : get필드명()
	public String getName() {
		return this.name;
	}
	public String getPersonId() {
		return this.personId;
	}
	public int getAge() {
		return this.age;
	}
	public char getGender() {
		return this.gender;
	}
	public String getPhone() {
		return this.phone;
	}
	public String getTiStory() {
		return this.tiStory;
	}
	
	
	
	public String information() {
		return this.name + "님의 인적사항 \n주민번호 : " + this.personId + "\n나이 : " + this.age
				+ "\n성별 : " + this.gender + "\n휴대폰번호 : " + this.phone + 
				"\n블로그 : " + this.tiStory;
	}
import com.ullebulle.chap03.model.vo.Person;
import com.ullebulle.chap03.model.vo.Product;

public class Run {
	public static void main(String[] args) {
		// 클래스  == 내가 만든 나만의 자료형 (1.참조자료형, 2.주소값 저장, 3.여러 개의 자료형에 여러 개의 값을 보관 + 기능)
		// 	    == 사용자 정의 자료형
		
		// person이라는 클래스를 통해 객체 생성
		
		Person person = new Person(); // 인스턴스화(객체화)
		
		person.setName("박머루");
		person.setPersonId("940711-20000000");
		person.setAge(29);
		person.setGender('F');
		person.setPhone("010-1234-5678");
		person.setTistory("https://ullebulle-it.tistory.com/");
		
//		=> 값을 입력하지 않을 경우 기본값이 들어있다
//				--> 기본형은 0, 0.0, 공백 / 참조형은 null
//		값 대입 => setter
		
		System.out.println(person.information());
		System.out.println(person); // person 객체가 있는 주소가 나옴
		// com.ullebulle.chap03.model.vo.Person@6d06d69c
		
		
		Product product = new Product();
		
		product.setName("아이폰13");
		product.setPrice(1380000);
//		product.setBrand();
		// => 필드 선언하면서 초기값을 넣어줬기 때문에 따로 값을 입력하지 않아도 출력이 된다.
		System.out.println("");
		System.out.println(product.getName());
		System.out.println(product.getPrice());
		System.out.println(product.getBrand());
		System.out.println("\n" + product.information());
		
	}

필드(field)
 필드(field) : 클래스를 구성하는 요소 중 하나! 
 *  어떠한 데이터를 저장하기 위한 역할(변수!)
 *  클래스 내부지만 메소드 밖의 영역에 정의함!!

 * 변수 구분
 * - 필드 : 클래스 영역에 바로 선언하는 변수!!
 * - 지역변수 : 클래스 영역 내에 특정한 구역{ } => 메소드, for문 등등.. 코드블럭
 *   for(int i = 0; 조건식; 증감식){ } =>초기식에 선언된 변수 i도 지역변수
 

 * 1. 전역변수
 *  - 클래스 변수(static 변수) : static이라는 예약어가 붙은 변수!
 *  생성시점 : 프로그램 실행과 동시에 static 영역에 할당! 
 *  소멸시점 : 프로그램이 종료될 때
 *  => 해당 객체가 생성되지 않더라도 무조건 프로그램 실행과 동시에 할당이 됨!
 *  
 *  - 멤버변수(인스턴스변수, 필드) 
 *   생성시점 : new 키워드를 사용하면 해당 객체를 생성하는 순간 메모리 영역에 할당! => heap 영역
 *   소멸시점 : 객체가 소멸될 때 => 가비지컬렉터
    

 *  2. 지역변수
 *   생성시점 : 특정한 구역{ } 실행 시 메모리 영역에 할당 => stack
 *  소멸시점 : 특정한 구역{ } 종료시 소멸


public class FieldTest1 {
		
		//멤버변수(인스턴스변수, 필드) : 초기값(기본값)이 들어있기 때문에 초기화를 안해도 사용 가능
		private int global;
						   //num 매개변수 => 지역변수에 포함됨
		public void test(int num) {//test 메소드 시작
			//지역변수를 사용해보자!
			
			int local = 0; // 지역변수 : 초기화를 반드시 해줘야함!!
			
			System.out.println(global); // 멤버변수, 필드
			System.out.println(local); // 지역변수
			System.out.println(num); // 매개변수(지역변수)
			
			
		}//test 메소드 끝
필드에서 사용 가능한 접근제한자 4가지
 * (+) public => 같은 프로젝트 내부에서 어디서든(같은 패키지, 다른 패키지 모두~~) 접근 가능하게 하고 싶다.
 
 * (#) protected => 같은 패키지면 무조건 접근 가능!
 *  다른 패키지면 상속구조인 클래스에서만 접근 가능하다.
 *  상속이라는 개념은 다다음시간에 다룰 것..

 * (~) default => 오로지 같은 패키지에서만 접근 가능, 생략 가능
 *  (default 생략) String name;

 * (-) private => 오직 해당 클래스 안에서만 접근 가능
   
 * => 위에서 아래로 내려갈수록 접근할 수 있는 범위가 좁아진다!
 * => +, #, ~, - : 클래스 다이어그램  표기 방법.
클래스변수(static 변수) 와 상수필드(static필드)에 대하여
[표현법]
접근제한자  예약어(생략가능) 자료형 필드이름;

public static String sta = "static 변수";
  생성시점 : 프로그램 실행과 동시에 메모리의 static 영역에 할당됨
  소멸시점 : 프로그램 종료시 소멸됨
  => 객체를 생성하지 않고 할당됨!!!

  static "공유"의 개념이 강하다!
  프로그램 실행과 동시에 메모리영역에 공간을 만들어두고 그 안에 값을 공유해서 쓰자!!


 * 상수필드

 * [표현법]
 *  public static final 자료형 상수필드이름 = 값;

 *  => 한 번 지정된 값을 고정해서 쓰겠다. 그래서 무조건 초기화 해줘야 됨!!!!!!!!!!!!
 *  => public final static 예약어 순서는 상관 없음
   
 *  static : 공유의 개념(재사용성)
 *  final : 한 번 지정해놓고 변경하지 않겠다(상수선언)
 
 *  값이 변경되어서는 안되는 고정적인 값을 메모리상(static)에 올려놓고
 *  (프로그램 시작과 동시에 메로리 영역에 할당, 값이 변하지도 않음)
 *  공유할 목적으로 사용'
 
 *  상수필드 이름도 반드시 항상 모두 대문자여야 한다@!
메소드(method)
 * 메소드(Method) : 입력을 가지고 어떤 일을 수행한 다음에 결과물을 내놓는다!!
 
 * [표현법]
     접근제한자 예약어(생략가능) 반환형 메소드식별자(매개변수의 자료형 매개변수식별자{
         수행할 코드;
         return 반환값;
       }

 * 생략 가능한 것 : 예약어, 매개변수, return문 부분(반환형이 void일 경우)
 * 반환형 : 반환할 값의 자료형
 * 호출할 때 인자값 => 매개변수의 자료형과 갯수가 일치해야 한다 반드시!!!!
 
 * 한 번 정의해두고 필요할 때마다 호출해서 사용 가능 언제든!!!!
// 1. 매개변수가 없고 반환값도 없는 메소드
	public void method1() {
		System.out.println("매개변수와 반환값 둘 다 없는 메소드");
		
		int sum = 0;
		for(int i = 1; i <= 10; i++) {
			sum = sum + i;
		}
		System.out.println(sum);
	}
	// return;
	// void 일 경우 return이 생략, JVM이 자동으로 만들어 줌!
	
	
	// 2. 매개변수는 없고 반환값은 있는 메소드
	public int method2() {
		System.out.println("매개변수는 없고 반환값은 있는 메소드입니다.");
		// 1에서부터 100까지의 랜덤값을 발생시켜 돌려주고싶다.
		return (int)(Math.random() * 100) + 1;
	}
	
	// 3. 매개변수는 있고 반환값은 없는 메소드
	public void  method3(int num1, int num2) {
		System.out.println("매개변수는 있고 반환값은 없는 메소드입니다.");
		
		int min = 0;
		int max = 0;
		
		if(num1 < num2) {
			max = num2;
			min = num1;
		} else {
			max = num1;
			min = num2;
		}
		System.out.println("최소값 : " + min + ", 최대값 : " + max);
	}
	
	//4. 매개변수도 있고 반환값도 있는 메소드
	public int method4(int a, int b) {
		System.out.println("매개변수도 있고 반환값도 있다.");
		return a + b;
	}
	
	/*
	 *  반환형이 없는 메소드 : 출력문을 작성하는편
	 *  반환형이 있는 메소드 : 호출하는 부분에서 출력문을 작성
	 * 	=> 보편적으로 약속
	 */