
package edu.kh.oop.cls.model.vo;
public class Student { //클래스 선언부
//[접근제한자] [예약어] class 클래스명 {}
// 접근제한자 public : 같은 프로젝트 내에서 어떤 클래스에서든 import 할 수 있음을 나타냄.
//필드: 객체의 속성을 작성하는 클래스 내부 영역
// == 멤버 변수 : 메서드 밖에 작성된 변수
// 1)인스턴스 변수 : 필드에 작성되는 일반 변수(객체 미생성시 사용 불가)
// 2)클래스 변수 (== static 변수): 필드에 static 예약어가 작성된 변수(객체 생성 안해도 쓸 수 있음)
//필드 구성
/*
* [접근제한자] [예약어] 자료형 변수명 [= 초기값]; //대괄호는 선택사항
* + public | final | 기본자료형
* # protected | ststic | 배열
* ~ (default) | final static| 클래스명
* - private | static final| (참조형)
*
*
* */
// => 필드의 접근제한자는 : 직접 접근 가능한 범위를 나타냄.
public int v1 = 10;
protected int v2 = 20;
int v3 = 30;
// 특별한 경우 아니면 private 사용
private int v4 = 40;
public void ex() {
System.out.println("같은 클래스 내부 직접 접근");
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
System.out.println(v4);
}
//====================================================
//static 예약어
public static String schoolName = "kh정보교육원";
private String name; // 캡슐화원칙 private - - > 간접접근방법이 필요
{
// 초기화 블록 : 객체 생성 시 필드 값 초기화
name = "홍길동";
}
//getter /setter
public String getName() {
return name;
}
public void setName(/*매개변수 작성 ->(자료형 변수이름)*/String name) {
this.name = name;
}
//==================================================================
//생성자(Constructor)
/*
* - new 연산자를 통해서 객체를 생성할 때
* 생성된 객체의 필드 값 초기화 + 지정된 기능을 수행하는 역할
*
*
* - 생성자 규칙
* 1) 생성자의 이름은 반드시 클래스명과 같아야 한다.
* 2) 반환형이 존재하지 않는다.
*
*
* - 생성자 종류
* 1) 기본 생성자
* 2) 매개변수 생성자
*
* */
//기본 생성자
// [접근제한자] 클래스명() { }
public Student() {
//객체가 생성될 때 수행할 코드
System.out.println("기본 생상자에 의해 Student 객체가 생성됨");
}
//메소드
}
package edu.kh.oop.cls.model.service;
import edu.kh.oop.cls.model.vo.Student;
public class ClsService {
// 클래스 접근제한자 확인하기
public void ex1() {
Student std = new Student();
// public class인 Student는 import가능
//TestVo text = new TestVo();
//(default) class인 TestVo는 import 불가 (다른패키지여서)
System.out.println(std.v1);
//다른 패키지에서도 접근 가능한 public만 에러가 없다
}
public void ex2() {
//static 필드 확인 예제
//학생 객체 2개 생성
Student std1 = new Student();
Student std2 = new Student();
System.out.println(std1.schoolName);
//public 이기 때문에 직접 접근 가능
//System.out.println(std1.name);
System.out.println("변경 전 : " + std1.getName());
std1.setName("최진호");
System.out.println("변경 후 : " + std1.getName());
//std1.setName("최진호");
System.out.println(std2.schoolName);
//public 이기 때문에 직접 접근 가능
System.out.println("변경 전 : " + std1.schoolName);
std1.schoolName = "고등학교";
System.out.println("변경 후 : " + std1.schoolName); //schoolName은 private가 아니라 직접접근가능.
// schoolName에 노란줄이 뜨는 이유! -> 제대로 작성 안해서
// *** static이 붙은 필드(변수)는
// 클래스명.변수명 으로 사용함.
Student.schoolName = "kh";
System.out.println("Student.schoolName : " + Student.schoolName);
/*
* static
*
* 1) 공유 메모리 영역( 또는 정적 메모리 영역) 이라고 함.
*
* -> 프로그램 시작 시 static이 붙은 코드들이
* 모두 static 영역에 생성되고,
* 프로그램이 종료될 때 까지 사라지지 않음 . (정적)
* 그리고 static 영역에 생성된 변수는 어디서든 공유가능(공유)
*
*
* 2) 사용 법 : 클래스명.변수명
*
*
* */
}
}
package edu.kh.oop.cls.run;
import edu.kh.oop.cls.model.service.ClsService;
public class ClsRun {
public static void main(String[] args) {
ClsService cls = new ClsService();
//cls.ex1();
//cls.ex2();
cls.ex3();
}
}
package edu.kh.oop.cls.model.vo;
public class User {
//필드
//== 속성
//아이디, 비밀번호, 이름, 나이, 성별 --> 추상화
private String userId;
private String userPw;
private String userName;
private int userAge;
private char userGender;
//생성자
//기본 생성자
public User() {
//기능
System.out.println("기본 생성자로 User 객체 생성");
//필드 초기화
userId = "user01";
userPw = "pass01";
userName = "홍길동";
userAge = 20;
userGender = 'M';
}
//매개변수 생성자
//** 사용되는 기술, 변수 : 매개변수, Overloading(오버로딩), this
// ** 매개변수 : 생성자나 매서드 호출 시 () 안에 작성되어
// 전달되어지는 값을 저장하는 변수
// -> 전달 받은 값을 저장하고 있는 매개체(지니고있는) 역할의 변수
public User(String userId, String userPw) {
//매개변수
this.userId = userId;
this.userPw = userPw;
// 매개 변수로 전달받은 값을 필드에 초기화(this 참조변수)
//***this 참조변수***
// - 객체가 자기 자신을 참조할 수 있도록 하는 변수
// - 모든 객체 내부에 숨겨져있다.
// ?? 왜 사용 ??
// -> 필드명과 매개변수명이 같을 경우
// 이를 구분하기 위해서 주로 사용.
}
//필드를 전부 초기화 하는 목적의 매개변수 생성자
public User(String userId, String userPw, String userName, int userAge, char userGender) {
//this.userId = userId;
//this.userPw = userPw;
//User(userId, userPw); // User는 본인을 3인칭으로 부르는거 싫어함...
this(userId, userPw);//this() 생산자
// - 같은 클래스의 다른 생성자를 호출할 때 사용
// - 생성자내에 반드시 첫째줄에 작성되어야 한다!!
// 왜사용??
// 코드길이 감소, 재사용성 증가, 가독성의 문제로 잘 사용하지는 않음
this.userName = userName;
this.userAge = userAge;
this.userGender = userGender;
}
// *** 자바 ***
// 자바는 기본적으로 필드명, 생성자명, 메소드명, 변수명의 중복을 허용하지 않음.
// ***오버로딩(Over Loading)***
//- 클래스 내에 동일한 이름의 매서드(생성자도 포함)를 여러개 작성하는 기법
// -> 하나의 이름으로 여러 기능을 수행할 수 있게 한다.
//[오버로딩 조건]
//1) 메서드 (생성자 포함)의 이름이 동일
//2) 매개변수의 개수, 타입, 순서 중 1개라도 달라야함
//public User() {} // 기본 생성자가 이미 작성되어있어 중복으로 인식
public User(String userId) {}//매개변수의 개수가 같은 생성자가 없음
// -> 오버로딩 성립
public User(int userAge) {} //매개변수의 개수는 같지만 타입이 다름
//-> 오버로딩 성립
public User(String userId, int UserAge) {}
// 매개변수의 개수가 위에 같은것이 있으나, 매개변수의 타입이 다름.
// -> 오버로딩 성립
public User(int userAge, String userId) {}
// 매개변수의 개수와 타입은 같으나, 순서가 다름
// -> 오버로딩 성립
//public User(int userAge, String userName) {}
// 매개변수의 개수, 타입, 순서가 모두 같아서 오버로딩 불가
// -> 변수명은 신경쓰지 않는다!!
public User(String userId, String userPw, String userName) {}
//public User(String userName, String userId, String userPw) {}
// 위와 똑같은 이유로 오버로딩 불가
// 메서드
// 캡슐화로 인한 간접 접근 기능(getter/setter)
public String getUserId() { //userId getter
return userId;
}
public void setUserId(String userId) {//userId의 setter
this.userId = userId;
}
public String getUserPw() {//userPw의 getter
return userPw;
}
public void setUserPw(String userPw) {//userPw의 setter
this.userPw = userPw;
}
public String getUserName() {//userName의 getter
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public char getUserGender() {
return userGender;
}
public void setUserGender(char userGender) {
this.userGender = userGender;
}
// getter/ setter 자동완성
// alt + shift + s -> Generate Getters and Setter
// => 선택 후 generate
}
package edu.kh.oop.cls.model.service;
import edu.kh.oop.cls.model.vo.User;
public class ClsService {
public void ex3() {
//생성자 확인 테스트
Student s1 = new Student();
//기본 생성자
//user 기본 생성자를 이용해서 객체 생성
User u1 = new User();
// User 객체 필드 초기화 확인
System.out.println(u1.getUserId());
System.out.println(u1.getUserPw());
System.out.println(u1.getUserName());
System.out.println(u1.getUserAge());
System.out.println(u1.getUserGender());
// ==> 클래스에서 getter/setter 미작성시
// 간접 접근 불가능
System.out.println("===================================");
//문제점 : u1이 참조하고 있는 user객체와
// u2가 참조하고 있는 user객체가 필드의 값이 모두 동일함.
// 같은 기본생성자로 user객체 생성했기 때문에...
//해결 방법 1: setter를 이용해서 새로운 값을 대입
User u2 = new User();
u2.setUserId("dfafafasfd");
u2.setUserPw("dfafa");
u2.setUserName("김영희");
u2.setUserAge(5);
u2.setUserGender('M');
System.out.println(u2.getUserId());
System.out.println(u2.getUserPw());
System.out.println(u2.getUserName());
System.out.println(u2.getUserAge());
System.out.println(u2.getUserGender());
//매개변수 생성자 사용
User u3 = new User("test33", "pw234");
System.out.println(u3.getUserId());
System.out.println(u3.getUserPw());
System.out.println(u3.getUserName());
System.out.println(u3.getUserAge());
System.out.println(u3.getUserGender());
User u4 = new User("test44", "pw567");
System.out.println(u4.getUserId());
System.out.println(u4.getUserPw());
System.out.println(u4.getUserName());
System.out.println(u4.getUserAge());
System.out.println(u4.getUserGender());
User u5 = new User("test55", "pw888", "철수", 48, 'M');
System.out.println(u5.getUserId());
System.out.println(u5.getUserPw());
System.out.println(u5.getUserName());
System.out.println(u5.getUserAge());
System.out.println(u5.getUserGender());
}
}
package edu.kh.oop.cls.run;
import edu.kh.oop.cls.model.service.ClsService;
public class ClsRun {
public static void main(String[] args) {
ClsService cls = new ClsService();
//cls.ex1();
cls.ex2();
//cls.ex3();
}
}
package edu.kh.oop.cls.model.vo;
class TestVo {
// 접근제한자는 (default)상태이며 같은 패키지 내에서만 임포트가능
}


package edu.kh.oop.cls.model.vo;
public class Book {
//필드
private String title; // 도서명
private int price; // 가격
private double discountRate; // 할인율
private String author; // 저자명
//생성자
public Book() {}//기본생성자
//매개변수 생성자
public Book(String title, int price, double discountRate, String author) {
this.title = title;
this.price = price;
this.discountRate = discountRate;
this.author = author;
}
//메소드
//getter / setter
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public double getDiscountRate() {
return discountRate;
}
public void setDiscountRate(double discountRate) {
this.discountRate = discountRate;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
//어노테이션 toString() 오버라이드
@Override
public String toString() {
return title + " / " + price + " / " + discountRate + " / " + author;
}//문자열 리턴
}
package edu.kh.oop.cls.model.service;
import edu.kh.oop.cls.model.vo.Book;
public class BookService {
public void practice() {
// 1) 기본 생성자를 이용하여 첫 번째 Book 객체 생성
Book book = new Book();
// 2) 매개변수 생성자를 이용하여 두 번째 Book 객체 생성
Book book1 = new Book( "자바의 정석" , 30000 , 0.2 , "남궁성");
// 3) 객체가 가진 필드 값을 toString()을 이용하여 출력
System.out.println(book.toString());
System.out.println(book1.toString());
System.out.println("===========================");
// 4) 첫 번째 객체가 가진 값을 setter를 이용하여 수정
book.setTitle("C언어");
book.setPrice(30000);
book.setDiscountRate(0.1);
book.setAuthor("홍길동");
System.out.println("수정된 결과 확인");
// 5) 수정된 객체의 필드 값을 toString() 메소드를 이용하여 출력
System.out.println(book.toString());
System.out.println("===========================");
// 6) 각 객체의 할인율을 적용한 책 가격을 계산해서 출력
// 7) 할인된 가격 = 가격 - (가격 * 할인율)
System.out.printf("도서명 = %s\n" , book.getTitle() );
System.out.printf("할인된 가격 = %d원\n" , (int)(book1.getPrice() - (book1.getPrice() * book1.getDiscountRate())));
System.out.printf("도서명 = %s\n" , book1.getTitle());
System.out.printf("할인된 가격 = %d원\n" , (int)(book.getPrice() - (book.getPrice() * book.getDiscountRate())));
}
}
package edu.kh.oop.cls.run;
import edu.kh.oop.cls.model.service.BookService;
public class PracticeRun {
public static void main(String[] args) {
BookService book = new BookService();
book.practice();
}
}


package com.kh.practice.snack.model.vo;
public class Snack {
//필드
private String kind; // 종류
private String name; // 이름
private String flavor; // 맛
private int numOf; // 개수
private int price; //가격
//생성자
public Snack() {}
public Snack(String kind, String name, String flavor, int numOf, int price) {
this.kind = kind;
this.name = name;
this.flavor = flavor;
this.numOf = numOf;
this.price = price;
}
//메소드
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFlavor() {
return flavor;
}
public void setFlavor(String flavor) {
this.flavor = flavor;
}
public int getNumOf() {
return numOf;
}
public void setNumOf(int numOf) {
this.numOf = numOf;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String information() {
return kind + " (" + name + " - " + flavor + ") " + numOf + "개 " + price + "원";
}
package com.kh.practice.snack.controller;
import com.kh.practice.snack.model.vo.Snack;
public class SnackController {
private Snack s = new Snack();
public SnackController() {}
public String saveData(String kind, String name, String flavor, int numOf, int price) {
s.setKind(kind);
s.setName(name);
s.setFlavor(flavor);
s.setNumOf(numOf);
s.setPrice(price);
return "저장 완료되었습니다.";
}
public String confirmData() {
// 저장된 데이터를 변환함
return s.information();
}
}
package com.kh.practice.snack.view;
import java.util.Scanner;
import com.kh.practice.snack.controller.SnackController;
public class SnackMenu {
private Scanner sc = new Scanner(System.in);
private SnackController scr = new SnackController();
public void menu() {
System.out.println("스낵류를 입력하세요.");
System.out.print("종류 : ");
String kind = sc.nextLine();
System.out.print("이름 : ");
String name = sc.nextLine();
System.out.print("맛 : ");
String plavor = sc.nextLine();
System.out.print("개수 : ");
int count = sc.nextInt();
sc.nextLine();
System.out.print("가격 : ");
int price = sc.nextInt();
sc.nextLine();
System.out.println(scr.saveData(kind, name, plavor , count, price));
System.out.println("저장한 정보를 확인하시겠습니까?(y/n) : ");
String result = sc.next();
if(result.equals("y")) {
System.out.println(scr.confirmData());
}
}
}
package com.kh.practice.snack.run;
import com.kh.practice.snack.view.SnackMenu;
public class Run {
public static void main(String[] args) {
//menu 호출
SnackMenu sm = new SnackMenu();
sm.menu();
}
}