OPP 예제

Zino·2022년 12월 17일

Java

목록 보기
17/26
post-thumbnail

📙 예제 1

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();
	}

}

📗 예제 2

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();
	}

}

📒예제 3

package edu.kh.oop.cls.model.vo;

class TestVo {

	
			// 접근제한자는 (default)상태이며 같은 패키지 내에서만 임포트가능
}

📘 예제 4


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();
		
		
	}

}

📕 예제 5


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();
	}

}

profile
Willingness to be a fool!

0개의 댓글