본문 바로가기
백엔드/자바

자바 - 8

by study_yeon 2023. 5. 8.

2023.05.08

1교시

* 객체화
- 자동차가 달리다가 가스가 떨어져서 멈추는 기능을 만든 것

* 클래스 
-특성을 모아놓은 파일 

* 패키지는 폴더

* 데이터형식
- 휴먼(데이터클래스)

- 휴먼앱(실행클래스)

* 캡슐화

- 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 접근하지 못하도록 은닉하는 것

  (private을 통해 변수 선언)

- 접근제어자를 통해 이루어진다

- 객체가 제공하는 필드와 메소드를 통해서 접근 가능

  (메소드는 public으로 설정하여 간접 접근 - getter & setter)
- 메소드에 의해 값이 변동되는 것을 활용 (원인에 의해 값이 변동 되는 기능 - 메소드 함수)

 

* 접근제어자 

private: 같은 클래스
(default): 같은 패키지
protected: 같은 패키지 또는 다른 패키지의 자손 클래스에서 접근 가능
public: 접근 제한이 없음


* property 함수(속성함수)
Set - 데이터 값 설정, 변경 가능 
Get - 설정한 값을 읽어 오기, 멤버에 있는 데이터를 돌려줌,
set 파라미터 필요, return 값 필요없음(void), 멤버변수 this 이용하여 구분
get  인수 필요없음, return 값 필요
-> 멤버변수(private)는 실행클래스에서 직접 접근 불가하여  public으로 설정한 속성함수를 통해 접근(set, get 이용)

 

* 일관성있는 프로그램 만들기
- 참조변수 this를 사용하면 멤버변수를 부르는 모든 경우에 this 사용

-> get에서 this 써주기


* 모델링
- 불필요한 정보는 감춤

* 클래스를 객체화 시킬때 초기값을 설정해주는 함수
- 생성자 메소드
- 기본생성자가 자동으로 불려짐

* migration(마이그레이션)
- 기존의 것을 호환 등을 생각하여 고침
-> 업그레이드와 다름(마이그레이션이 좀 더 포괄적)


2교시


● Human 클래스 만들기

package human;

public class Human {
	
	// 멤버, 필드, 속성(attribute)
	double 키; 
	double 몸무게; 
	char 성별; 
	
    // get, set -> 멤버변수는 직접 접근 불가하여 속성함수를 통해 접근
	void set키(double 키) {
		this.키 = 키;
	}
	double get키() {
		return this.키;
	}
	void set몸무게(double 몸무게) {
		this.몸무게 = 몸무게;
	}
	double get몸무게() {
		return this.몸무게;
	}
	void set성별(char 성별) {
		this.성별 = 성별;
	}
	char get성별() {
		return this.성별;
	}
	
	// 사용자 정의 기본생성자 
	Human() {
		this.키 = 150;
		this.몸무게 = 50;
		this.성별 = '남';  // char 이라 '' 표시	
	}
	
	// 2. 멤버정보 보여주기(표현메소드)
	void printInfo() {
		System.out.printf("휴먼의 키 %f cm\n", this.get키());
		System.out.printf("휴먼의 몸무게 %f kg\n", this.get몸무게());
		System.out.printf("휴먼의 성별 %c\n", this.get성별());
		System.out.println("입니다.\n");
	}
	
}

- 성별은 한 글자로 표현 가능하여 char 사용 

* 사용자 정의 기본생성자 
- 기본생성자 구조 : 클래스명() {}
- 생성자는 객체가 생성되고 멤버를 초기화하는 역할
- 자기자신의 내용을 초기화하므로 -> 자기자신 == this


● HumanApp 클래스 만들기

package human;

public class HumanApp {   // 실행함수

	public static void main(String[] args) {
		
		// 실제 객체(object) 탄생 : 모델링 
		Human human = new Human();
		
		// 현재 human 객체의 상태를 알아보기(= 정보출력)
		System.out.printf("휴먼의 키 %f cm\n", human.get키());
		System.out.printf("휴먼의 몸무게 %f kg\n", human.get몸무게());
		System.out.printf("휴먼의 성별 %c\n", human.get성별());
		System.out.println("입니다.\n");
		System.out.println("---------------------------------");
		// 키 설정(값 변경)
		human.set키(180);
		// 몸무게 설정
		human.set몸무게(50);
		// 성별 설정
		human.set성별('남');
        
        // 출력
        
		// 1. 직접 타이핑
		System.out.printf("휴먼의 키 %f cm\n", human.get키());
		System.out.printf("휴먼의 몸무게 %f kg\n", human.get몸무게());
		System.out.printf("휴먼의 성별 %c\n", human.get성별());
		
		// 2. 새롭게 설정한 휴먼값 출력(데이터클래스에서 정의)
		human.printInfo();		
	}

}

 

- main 함수
- 객체가 메모리에 존재하려면 대상(사물 object)의 클래스 타입으로 메모리에 방 만드는 new 연산자, 생성자 메소드 사용 
- 출력 시 데이터 클래스에서 정의하여 출력하기  
- \n를 앞에 붙이면 문단 구분의 의미

3교시

* 디버그
- 내가 만든 메소드 안에 들어갈때, 세부적인 내용을 볼때 - 인포
- 일반적으로 넘어갈때 - 오버
- 내가 원하는 범위를 넘어가면 멈춤 누르고 다시 실행


●  Na 클래스 만들기(human의 상속 ver)

package human;

public class Na {
	
	// 멤버, 필드, 속성(attribute) - human과 동일
	double 키; 
	double 몸무게; 
	char 성별; 
    
	// 사용자 정의 기본생성자
	private Na() {
		this.키 = 150;
		this.몸무게 = 50;
		this.성별 = '남'; 
		this.이름 = "";
		this.전화번호 = "";
	}
	// 필수필드용 생성자
	Na(String 이름, String 전화번호) {
		this();  // 생성자 오버로딩(이름은 같고, 시그니처가 다름)
		this.이름 = 이름;
		this.전화번호 = 전화번호;
	}
	// 모든필드 생성자
	Na(String 이름, String 전화번호, double 키, double 몸무게, char 성별) {
		this.이름 = 이름;
		this.전화번호 = 전화번호;
		this.키 = 키;
		this.몸무게 = 몸무게;
		this.성별 = 성별;
	}
	// Na 클래스만의 멤버변수, 멤버메소드
	String 이름;
	String 전화번호;

- 사용자 정의 기본생성자(먼저 적기) -> 기본생성자 내부에 초기화값 작성
- 기본생성자 구조 : 클래스명() {}
- 생성자는 객체가 생성되고 멤버를 초기화하는 역할  
- 자기자신의 내용을 초기화하므로 -> 자기자신 == this
- Na 객체 내부에서만 쓸 수 있다. 
- 환상데이터이므로 봉인(private : 외부에서 호출금지)

속성함수
// set, get - human과 동일
	void set키(double 키) {
		this.키 = 키;
	}
	double get키() {
		return this.키;
	}
	void set몸무게(double 몸무게) {
		this.몸무게 = 몸무게;
	}
	double get몸무게() {
		return this.몸무게;
	}
	void set성별(char 성별) {
		this.성별 = 성별;
	}
	char get성별() {
		return this.성별;
	}
	
	// Na 클래스의 속성함수
	void set이름(String 이름) {
		this.이름 = 이름;
	}
	String get이름() {
		return this.이름;
	}
	void set전화번호(String 전화번호) {
		this.전화번호 = 전화번호;
	}
	String get전화번호() {
		return this.전화번호;
	}

* property 함수(속성함수)
set 데이터를 넣는 것, 파라미터 필요, return 값 필요없음(void), 멤버변수 this 이용 
get 멤버에 있는 데이터를 돌려줌, return 값, 인수 필요없음

출력 1.
// 멤버정보 보여주기(표현메소드)
	void printInfo() {
		System.out.printf("나의 키 %f cm\n", this.get키());
		System.out.printf("나의 몸무게 %f kg\n", this.get몸무게());
		System.out.printf("나의 성별 %c\n", this.get성별());
	}
	
	void printInfoNa() {
		System.out.printf("나의 키 %f cm\n", this.get키());
		System.out.printf("나의 몸무게 %f kg\n", this.get몸무게());
		System.out.printf("나의 성별 %c\n", this.get성별());
		
		System.out.printf("나의 이름 %s\n", this.get이름());
		System.out.printf("나의 전화번호 %s\n", this.get전화번호());
		System.out.println("입니다.\n");
	}
출력 2.
// 선택항목 멤버정보 보여주기(표현메소드) - private(접근제한자)
	private void printInfo(boolean isPrint) {     // 하단의 Info와 구분
		if (isPrint) {
			System.out.printf("나의 키 %f cm\n", this.get키());
			System.out.printf("나의 몸무게 %f kg\n", this.get몸무게());
			System.out.printf("나의 성별 %c\n", this.get성별());
		}
	}
	
	// 필수항목 멤버정보 보여주기
	void printInfo() {
		// 필수출력항목
		System.out.printf("나의 이름 %s\n", this.get이름());
		System.out.printf("나의 전화번호 %s\n", this.get전화번호());
        
		printInfo(true); // 선택항목 멤버정보
		System.out.println("입니다.\n");
	}

* 필수기능에서 선택기능을 불러옴 - boolean 활용(참일 경우 불러오기)

false의 경우 선택멤버는 출력이 안됨

* 멤버정보 보여주기 다름버전 == 함수오버로딩(Method Overloading)
메소드 오버로딩은 메소드 시그니처가 달라야합니다.
기존의 인포에 시그니처를 바꿈

시그니처 = 메소드명(매개변수 타입, ...)


* private - 객체 내부에서만 사용 가능
- 생성자 오버로딩에 의해 부르기 가능 ex) this()
- 외부에서 호출금지

* 선택항목의 printInfo()의 접근제어자를 private으로 함에 따라 NaApp에서 호출 가능여부가 결정됨.


4교시

* 메소드에는 최소 기능만 담기

● NaApp 클래스 만들기

package human;

public class NaApp {

	public static void main(String[] args) {
		Na na = new Na("황진이", "010-1234-8970");
		na = new Na("백두산", "010-8888-9999", 190, 70, '남');
		
		// na 객체의 멤버 내용 출력하기
		na.printInfo();  // 필수항목
	}
}


* 가비지콜렉터에 의해 사용되지 않는 것은 정리 됨

- na라는 변수의 주소가 가비지콜렉터에 의해 변경 됨


5교시

 

● BookApp 클래스 만들기

package model;

// 생성자오버로딩 사용하기전
public class BookApp {
	public static void main(String[] args) {
		Book book1 = new Book();
		book1.title = "이것이 자바다";
		book1.author = "신용권";
		book1.price = 35000;
		
		Book book2 = new Book();
		book2.title = "혼공자";
		book2.author = "신용권";
		book2.price = 25000;
		
		System.out.println("book1의 제목 : " + book1.title);
		System.out.println("book1의 저자 : " + book1.author);
		System.out.println("book1의 가격 : " + book1.price);
		
		System.out.println("book2의 제목 : " + book2.title);
		System.out.println("book2의 저자 : " + book2.author);
		System.out.println("book2의 가격 : " + book2.price);
		
	}
}

 

package model;

// 생성자오버로딩 사용
public class BookApp {
	public static void main(String[] args) {
		Book book1 = new Book("이것이 자바다", 35000, "신용권");
		System.out.println(book1.toString());
		printBookInfo(book1);    // static 함수는 static 함수만 부를 수 있다
		
		Book book2 = new Book();
		book2.settitle("혼자공부하는 자바");
		book2.setAuthor("신용권");
		book2.setPrice( 25000 );
		System.out.println(book2.toString());
		printBookInfo(book2);
	}
	// 파라미터로 Book타입을 받아서 정보 출력
	static void printBookInfo(Book book) {
		System.out.println("book의 제목 : " + book.gettitle()); // 인터페이스를 통해 접근 가능(get)
		System.out.println("book의 저자 : " + book.getAuthor());
		System.out.println("book의 가격 : " + book.getPrice());
	}
}

* book1과 book2객체는 main안에서만 보이는 객체 = 로컬변수 
- 외부에서 받아오려면 파라미터(매개변수)로 받아와야 함

 

* private(접근제한자)
-선택기능은 메인에서 보이지 않아도 되기 때문에 private을 활용

- 공유대상을 한정 짓는 것이 접근제어자

* static 프로그램이 시작될때 한 번만 만들어놓고 재사용(공유)한다.


● Book 클래스 만들기(데이터클래스)

package model;

public class Book {
	private String title; // 외부에서 볼 수 없음, 외부에서는 속성함수를 이용하여 접근
	private int price;
	private String author;
	
	// 생성자
	public Book(String title, int price, String author) {
		this.title = title;
		this.price = price;
		this.author = author;
	}
	
	// 사용자정의기본생성자 - 명시적으로 객체를 생성하고 비어있음
	public Book() {
		this.title = "";  // 타이틀 없음
		this.author = ""; // 저자 없음
		this.price = 0;   // 가격 없음
	}
	// get, set 속성함수
	public String gettitle() {
		return this.title;
	}
	public void settitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	@Override   // 부모(object)가 가지고 있는 것을 상속 받음
    // 2. toString 이용 방법
	public String toString() {
		String retVal = "" + 
			"book의 제목 : " + this.gettitle() + // 인터페이스를 통해 접근 가능(get)
			"\nbook의 저자 : " + this.getAuthor() +
			"\nbook의 가격 : " + this.getPrice() +
			"\n";
		
		return retVal;
	
		
	// 1. 자동 toString 이용 방법
	public String toString() {
		 return "Book [title=" + title + 
			", price=" + price + 
			", author=" + author + "]";
	}
	

}


* 유사개념 
상호작용 = 인터페이스 = 메소드요청 = 메소드호출 = 메세지요청
객체가 객체의 메소드를 호출한다

* 두 객체가 같은가
1. 객체가 같은 주소를 가지고 있는가 (==)
2. 객체가 같은 내용을 가지고 있는가 (equals)

Book book1 = new Book("이것이 자바다", 35000, "신용권");
Book book2 = new Book("혼자공부하는 자바", 25000, "신용권");

if (book1 == book2) {
		System.out.println("book1과 book2는 같습니다.");
	} else {
		System.out.println("book1과 book2는 다릅니다.");
	}

* 결과값 = book1과 book2는 다릅니다.

-> 생성자에 의해 다른 주소에 저장 됨


6교시

코드 개선하기
-> 멤버변수에는 직접 접근하게하면 안되고 속성함수를 이용해야함

 

* 속성함수 이용의 장점 - 보안

static void printBookInfo(Book book) {
System.out.println("book의 제목 : " + book.gettitle());         // 인터페이스를 통해 접근 가능(get)
System.out.println("book의 저자 : " + book.getAuthor());
System.out.println("book의 가격 : " + book.getPrice());
}

* 책저자를 생성자로 변경하면 

Book book1 = new Book("이것이 자바다", 35000, "신용권");
//book1.title = "이것이 자바다";
//book1.author = "신용권";
//book1.price = 35000;
동일
printBookInfo(book1);


* 자동생성 

- 오른쪽마우스 or 상단메뉴 > Source > Generate 에서 원하는 기능 선택

Generate getter and setter

* getter and setter 자동생성

constructor using fields

* constructor(생성자) 자동생성

toString()

* toString() 자동생성

노란 줄은 원하는 생성 위치 지정

 


7교시

* toString()

- 객체를 문자열(String)으로 변환하기 위한 메서드

- 객체의 정보를 출력하는 보고서 함수


public String toString() {
return "아무 문자열이나 만들면 됩니다.";
}

해시코드

- 해시코드를 보여줌 
- 해시코드가 다름  = 메모리가 다름


-> generate에서 자동 생성

문자열이라 연결하여 작성 가능(좌우 동일)



8교시 

예제풀기
Calculator 클래스를 만드시오

정수 x,y를 멤버로 가진다
retCalc 정수형 배열

1) 정수형을 리턴하는 함수를 만들기
add(x, y)
sub(x, y)
mul(x, y)
div(x, y)

2) 사용자 정의 생성자 만들기
생성자(x, y)
멤버x에 x를 대입
멤버y에 y를 대입

3) 1과 2를 통해
->calc() 함수를 이용하여 사칙연산 결과값을 배열로 리턴할 것

계산값의 배열의 순서
인덱스번호
0 : 덧셈 결과
1 : 뺄셈 결과
2 : 곱셈 결과
3 : 나눗셈 결과
계산결과 배열의 이름 returnClac

4) toString 함수작성하시오(0 : 결과값)
x : 0, y : 0 
x + y = 0
x - y = 0
x * y = 0
x / y = 0




'백엔드 > 자바' 카테고리의 다른 글

자바 - 10  (0) 2023.05.10
자바 - 9  (0) 2023.05.09
자바 - 7  (0) 2023.05.04
자바 - 6  (0) 2023.05.03
자바-5  (0) 2023.05.02