Java 초급 (46)

반응형

 

getter, setter

 

private의 경우 외부에서 사용이 불가하기에 우회하여 사용할 수 있는 getter, setter을 이용한다.

 

- setter : 데이터를 입력, 파라미터를 넣음

- getter : 데이터를 확인, 리턴 값이 존재

 

package kr.or.ddit.study06.sec06;

public class PrivateMain {
	public static void main(String[] args) {
		PrivateTest pt1 = new PrivateTest();
		// a가 private일 경우 아래와 같은 식은 불가능. - > get과 set을 사용해야함.
//		pt1.a = 10;
	}
}

 

package kr.or.ddit.study06.sec06;

public class PrivateTest {
	private int a;
	private int b;
	
	public int getA() {
		return a;
	}
	
	// 메소드를 사용하여 private의 값을 가져옴.
	// 문제가 생길 시 아래와 같이 검증하여 데이터를 집어 넣을 수 있음.
	public void setA(int a) {
		if(a < 0) {
			System.out.println("음수는 입력 안되요.");
		}
		this.a = a;
	}
	
	public int getB() {
		return b;
	}
	
	public void setB(int b) {
		this.b = b;
	}
}

 

 

package kr.or.ddit.study06.sec06;

public class Student {
	private int age;
	private String name;
	
	// public을 기입하지 않을 시 파일이 들어 있는 패키지에서만 가져올 수 있음
	public Student() {
		
	}
	
	Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// 데이터을 입력할 때
	public void setAge(int age) {
		if(age<0) {
			System.out.println("음수는 입력 불가.");
		}
		this.age = age;
	}
	
	// 데이터를 가져올 때
	public int getAge() {
		return age;
	}
	
	// 데이터를 입력할 때 체크
	public void setName(String name) {
		if(name.length() > 4) {
			System.out.println("4자 이상의 이름은 입력이 불가능.");
			return;
		}
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	@Override
	public String toString() {
		return "Student [age=" + age + ", name=" + name + "]";
	}
}

 

package kr.or.ddit.study06.sec06;

import java.util.Scanner;

public class StudentMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); 
		Student st1 = new Student();
		int age = sc.nextInt();
		st1.setAge(age);
		
		Student st2 = new Student();
		int age2 = sc.nextInt();
		st2.setAge(age2);
		
		String str = "김철수";
		str.length();
		
		System.out.println(st1.getAge());
		System.out.println(st2.getAge());
		System.out.println(str.length());
	}
}

 

결과 화면

 

 

package kr.or.ddit.study06.sec06;

public class Book {
	/*
	 * 책 이름, 저자, 출판일, 가격
	 */
	private String bookName;
	private String bookWriter;
	private String regDate;
	private int price;
	
	// 기본 생성자
	public Book() {
		
	}
	
	public Book(String bookName, String bookWriter, String regDate, int price) {
		this.bookName = bookName;
		this.bookWriter = bookWriter;
		this.regDate = regDate;
		this.price = price;
	}
	
	public String getBookName() {
		return bookName;
	}
	
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

	
	public String getBookWriter() {
		return bookWriter;
	}

	public void setBookWriter(String bookWriter) {
		this.bookWriter = bookWriter;
	}

	
	public String getRegDate() {
		return regDate;
	}

	public void setRegDate(String regDate) {
		this.regDate = regDate;
	}

	
	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
	
}

 

package kr.or.ddit.study06.sec06;

public class BookMain {
	public static void main(String[] args) {
		Book b1 = new Book();
		// set 데이터를 집어 넣음 | 파라미터 존재
		// get 데이터를 가져옴 | 파라미터 없음
		b1.setBookName("목소리들");
		b1.setBookWriter("이승우");
		b1.setRegDate("2023년 11월 30일");
		b1.setPrice(16000);
		
		Book b2 = new Book();
		b2.setBookName("목소리들");
		b2.setBookWriter("이승우");
		b2.setRegDate("2023년 11월 30일");
		b2.setPrice(16000);

		System.out.println(b1.getBookName() + ", " + b1.getBookWriter() + ", " + b1.getRegDate() + ", " + b1.getPrice());
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study06.sec06;

public class Sing {
	/*
	 * 노래 가사 일부, 노래 제목, 가수.
	 */
	
	private String lyrics;
	private String title;
	private String singer;
	
	public Sing() {
		
	}
	
	public Sing(String lyrics, String title, String singer) {
		this.lyrics = lyrics;
		this.title = title;
		this.singer = singer;
	}

	public String getLyrics() {
		return lyrics;
	}

	public void setLyrics(String lyrics) {
		this.lyrics = lyrics;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getSinger() {
		return singer;
	}

	public void setSinger(String singer) {
		this.singer = singer;
	}
	
}

 

package kr.or.ddit.study06.sec06;

public class SingMain {
	public static void main(String[] args) {
		Sing s1 = new Sing();
		s1.setLyrics("가사1");
		s1.setTitle("제목1");
		s1.setSinger("가수1");
		
		System.out.println(s1.getLyrics() + ", " + s1.getTitle() + ", " + s1.getSinger());
		
	}
}

 

결과 화면3

 

 

package kr.or.ddit.study06.sec06;

public class Food {
	/*
	 * 음식 이름, 음식 설명, 조리시간
	 */
	private String foodName;
	private String foodExp;
	private int time;
	
	Food() {
		
	}
    
	// 생성자인데(or 메소드인데) 파라미터만 달라짐 -> 오버로딩
	Food(String foodName, String foodExp, int time) {
		this.foodName = foodName;
		this.foodExp = foodExp;
		this.time = time;
	}

	public String getFoodName() {
		return foodName;
	}

	public void setFoodName(String foodName) {
		this.foodName = foodName;
	}

	public String getFoodExp() {
		return foodExp;
	}

	public void setFoodExp(String foodExp) {
		this.foodExp = foodExp;
	}

	public int getTime() {
		return time;
	}

	public void setTime(int time) {
		this.time = time;
	}
}

 

package kr.or.ddit.study06.sec06;

public class FoodMain {
	public static void main(String[] args) {
		Food f1 = new Food();
		f1.setFoodName("음식이름");
		f1.setFoodExp("음식 설명");
		f1.setTime(3);
		
		System.out.println(f1.getFoodName() + ", " + f1.getFoodExp() + ", " + f1.getTime());
	}
}

 

결과 화면4

 

 

 

재귀 함수

 

: 나 자신을 다시 불러오는 함수

 

package kr.or.ddit.study06.sec04;

import java.util.Date;

public class Recrucive {
	public static void main(String[] args) {
		Recrucive rc = new Recrucive();
//		rc.call(10);
		
		System.out.println(rc.factorial(5));
		System.out.println(rc.fibo(3));
		
		Date d1 = new Date();
		Date d2 = new Date();
		
		System.out.println(d2.getTime() - d1.getTime());
	}
	
	/*
	 * 피보나치 수열
	 * 1 1 2 3 5 8 13 21 34
	 */
	// 아래와 같은 식으로 할 시 재귀함수의 속도가 느리다는 것을 보완할 수 있다. 
	long[] result = new long[100];
	public long fibo(int num) {
		if(num == 1) return 1;
		if(num == 2) return 1;
		long l = 0;
		if(result[num] == 0) {
			l = fibo(num-1) + fibo(num-2);
			result[num] = l;
		} else {
			l = result[num];
		}
		return l;
	}
	
	/*
	 * n을 입력후
	 * n * n-1 * n-2 ...... * 2 * 1
	 */
	public long factorial(long num) {
		if(num == 1) return 1; // 주석 시 stack Overflow Error 발생 => 종료 조건 필수
		return num * factorial(num-1);
	}
	
	// 재귀 함수
	// 메모리가 잘 커지기에 사용할 때 주의해야 함.
	public void call(int num) {
		if(num == 0) return;
		System.out.println("호출");
		call(num-1);
	}
}

 

결과 화면5

 

 

반응형
반응형

 

문제

 

카드를 섞고 승패를 비교하라.

승패를 비교할 시 내 카드는 가장 첫장으로 하며, 비겼을 때의 경우와 카드 타입의 경우는 신경쓰지 않는다.

 

package kr.or.ddit.homework.home12;

public enum Type {
	DIA, CLOVER, HEART, SPADE
}

 

package kr.or.ddit.homework.home12;

public class Card {
	int num;
	String type;
	
	public Card(int num, String type) {
		this.num = num;
		this.type = type;
	}

	@Override
	public String toString() {
		return "Card [num=" + num + ", type=" + type + "]";
	}
	
	
}

 

package kr.or.ddit.homework.home12;

public class Deck {
	public static void main(String[] args) {
		Deck deck = new Deck();
		Card[] cList = deck.cardList();
		for (Card card : cList) {
			print(card);
		}
	}
	
	public static void print(Card card) {
		String type = "";
		if(card.type == Type.DIA.name()) type ="◆";
		if(card.type == Type.CLOVER.name()) type ="♣";
		if(card.type == Type.HEART.name()) type ="♥";
		if(card.type == Type.SPADE.name()) type ="♠";
		
		String num = card.num+"";
		if(card.num == 1) num ="A";
		if(card.num == 11) num ="J";
		if(card.num == 12) num ="Q";
		if(card.num == 13) num ="K";
		System.out.println(type+num);
	}
	
	
	/*
	 *  내카드랑 다음카드랑 비교해서 승패 비교하기.
	 */
	
	/*
	 *  카드 섞기
	 */
	
	public Card[] cardList() {
		Card[] cardList = new Card[52];
		int cur =0;
		for (Type t : Type.values()) {
			for(int i=1; i<=13; i++) {
				Card card = new Card(i, t.name());
				cardList[cur++] = card; 
			}
		}
		return cardList;
	}
	
	
}

 

 

 

정답

 

package kr.or.ddit.homework.HomeWork12;

public enum Type {
	DIA, CLOVER, HEART, SPADE
}

 

package kr.or.ddit.homework.HomeWork12;

public class Card {
	int num;
	String type;
	
	public Card(int num, String type) {
		this.num = num;
		this.type = type;
	}

	@Override
	public String toString() {
		return "Card [num=" + num + ", type=" + type + "]\n";
	}
}

 

package kr.or.ddit.homework.HomeWork12;

import java.util.Arrays;
import java.util.Random;

public class Deck {
	public static void main(String[] args) {
		Deck deck = new Deck();
		Card[] cList = deck.cardList();
		for (Card card : cList) {
			print(card);
		}
		
		// 카드 섞기
		cList = deck.shuffle(cList);
		
		// 승패 비교
		Card myCard = cList[0];
		boolean win = deck.winChk(cList, myCard);
		System.out.print("내 카드 : ");
		print(myCard);
		System.out.print("상대 카드 : ");
		print(cList[1]);
		if(win == true) {
			System.out.println("승리하였습니다.");
		}else { // 지거나 무승부
			System.out.println("졌습니다.");
		}
		
	}
	
	public static void print(Card card) {
		String type = "";
		if(card.type == Type.DIA.name()) type ="◆";
		if(card.type == Type.CLOVER.name()) type ="♣";
		if(card.type == Type.HEART.name()) type ="♥";
		if(card.type == Type.SPADE.name()) type ="♠";
		
		String num = card.num+"";
		if(card.num == 1) num ="A";
		if(card.num == 11) num ="J";
		if(card.num == 12) num ="Q";
		if(card.num == 13) num ="K";
		System.out.println(type+num);
	}
	
	
	/*
	 *  내카드랑 다음카드랑 비교해서 승패 비교하기.
	 */
	public boolean winChk(Card[] cardList, Card my) {
		// 랜덤으로 뽑은 카드랑 비교.
//		System.out.println(my); // 내가 뽑은 카드의 번호와 타입 확인
//		System.out.println(cardList[1]); // 다음 카드의 번호와 타입 확인
		
		// 스페이드 > 다이아 > 하트 > 클로버
		if(my.num > cardList[1].num) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/*
	 *  카드 섞기
	 */
	public Card[] shuffle(Card[] cardList) {
		int length = cardList.length; // 52개의 카드
		Card[] tempCard = new Card[length];
		
		for(int i=0; i<length; i++) {
			int ran = new Random().nextInt(length)+1;
			tempCard[i] = cardList[ran-1];
			for(int j=0; j<i; j++) {
				if(tempCard[i] == tempCard[j]) {
					i--;
					break;
				}
			}
		}
//		System.out.println(Arrays.toString(tempCard));
		return tempCard;
	}
	
	public Card[] cardList() {
		Card[] cardList = new Card[52];
		int cur =0;
		for (Type t : Type.values()) {
			for(int i=1; i<=13; i++) {
				Card card = new Card(i, t.name());
				cardList[cur++] = card; 
			}
		}
		return cardList;
	}
}

 

 

반응형
반응형

 

enum 타입

 

: 열거형 자료 타입이다.

타입을 명확하게 하기 위해 사용한다.

 

package kr.or.ddit.study05.sec03;

public enum Day {
	// 개발자로서의 약속
	// 대문자를 사용하는 것이 원칙
	MON, TUE, WED, THU, FRI, SAT, SUN
}

 

package kr.or.ddit.study05.sec03;

import java.util.Scanner;

public class DayExample {
	public static void main(String[] args) {
//		Scanner sc = new Scanner(System.in);
//		int day = sc.nextInt();
		
		// enum 타입에서 꺼내와서 day에 넣음
		Day day = Day.MON;
		if(day == Day.MON) {
			System.out.println("월요일");
		} else if(day == Day.TUE) {
			System.out.println("화요일");
		} else if(day == Day.WED) {
			System.out.println("수요일");
		} else if(day == Day.THU) {
			System.out.println("목요일");
		} else if(day == Day.FRI) {
			System.out.println("금요일");
		} else if(day == Day.SAT) {
			System.out.println("토요일");
		} else if(day == Day.SUN) {
			System.out.println("일요일");
		}
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study05.sec03;

public enum DeviceType {
	
	Mobile("안드로이드"), 
	WEB("스프링"),
	Server("리눅스");
	
	// 생성자
	DeviceType(String name) {
		this.name = name;
	}
	
	String name;
}

 

package kr.or.ddit.study05.sec03;

public class Developer {
	public static void main(String[] args) {
		DeviceType dt = DeviceType.Mobile;
		
		// enum 타입을 사용하면 특정 타입의 데이터만 꺼내올 수 있음
		System.out.println(dt.name);
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study05.sec03;

public enum Month {
	/*
	 * 1 ~ 12월까지 타입 만들고 
	 * if문을 통해 무슨 월이 입력 되었는지 출력해보기.
	 */
	
	JAN("1월"), FEB("2월"), MAR("3월"), APR("4월"), MAY("5월"), JUNE("6월"), 
	JULY("7월"), AUG("8월"), SEP("9월"), OCT("10월"), NOV("11월"), DEC("12월");
	
	String m;
	// 생성자
	Month(String m) {
		this.m = m;
	}
}

 

package kr.or.ddit.study05.sec03;

public class MonthExample {
	public static void main(String[] args) {
		Month m = Month.DEC;
		
		// Month.values에는 Month에 있는 모든 값이 들어가 있음
		for(Month month : Month.values() ) {
			if(m == month) {
				System.out.println(m.m);
			}
		}
		
	}
}

 

결과 화면3

 

 

 

패키지 선언

 

패키지란 클래스 작성 시 해당 클래스가 어떤 곳에 속할 것인지 결정하는 것을 이야기한다.

 

패키지는 아래와 같은 규칙이 존재한다.

 - 숫자로 시작 불가

 - _ 및 $ 제외 특수문자 사용 불가

 - java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가

 - 모두 소문자로 작성

 

 

 

import

 

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속된 경우 사용해야 한다.

해당 패키지 클래스 또는 인터페이스를 가져와 사용할 것임을 통지해야 한다.

 

 

 

 

접근 제한자

 

: 클래스와 인터페이스 및 이름을 가진 멤버의 접근을 제한한다.

 

- public 

: 외부 클래스에서도 자유롭게 사용 가능.

 

- protected

: 같은 패키지 또는 자식 클래스에서만 사용 가능.

 

- private

: 외부에서 사용 불가. => 나 자신만.

 

- default 

: 같은 패키지에 소속된 클래스에서만 사용 가능.

아무것도 선언하지 않았을 때가 default임

 

 

 

static 예시

 

static이란 클래스에 고정되어 있는 변수나 메소드를 이야기 한다.
메모리에 고정적으로 할당되며 객체 생성 없이 사용할 수 있다는 특징이 있다.

 

package kr.or.ddit.study06.sec05;

public class StaticTest {
	static int a = 0;
	int b = 0;
	
	// public 메소드의 경우 static 값도 접근할 수 있음 => 모든 값 접근 가능
	public void addA1() {
		a++;
	}
	
	// static 메소드의 경우 static 값만 접근할 수 있음
	public static void addA2() {
		a++;

	}
	public void addB1() {
		b++;
	}
	public static void addB2() {
//		b++;
		System.out.println("static 메소드에서는 인스턴스"+"멤버인 b 값을 부를 수 없다.");
	}
}

 

package kr.or.ddit.study06.sec05;

public class StaticMain {
	public static void main(String[] args) {
		StaticTest s1 =new StaticTest();
		s1.addA1(); // a = 1
		s1.addA2(); // a = 2
		s1.addB1(); // b = 1
		s1.addB2(); // syso
		
		StaticTest s2 =new StaticTest();
		s2.addA1(); // a = 3
		s2.addA2(); // a = 4
		s2.addB1(); // b = 1
		s2.addB2(); // syso
		s2.addB1(); // b = 2
		s2.addB2(); // syso
		
		StaticTest s3 =new StaticTest();
		s3.addA1(); // a = 5
		s3.addA2(); // a = 6
		
		System.out.println(StaticTest.a+", "+s1.b);
		System.out.println(StaticTest.a+", "+s2.b);
		System.out.println(StaticTest.a+", "+s3.b);
	}
}

 

결과 화면4

 

 

 

싱글톤 패턴

 

: 디자인 패턴 중 하나로, 객체의 인스턴스가 오직 1개만 생성되는 패턴을 이야기한다.

ex) 은행 서비스

 

 

사용 이유

메모리를 효율적으로 관리할 수 있음.

데이터 공유가 쉬움

 

ex) 

package kr.or.ddit.study06.sec05;

public class BigLoadSingleTone {
	static BigLoadSingleTone instance = null;
	
	public BigLoadSingleTone() {
		try {
			// 3초 동안 멈춤
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static BigLoadSingleTone getInstance() {
		if(instance == null) {
			instance = new BigLoadSingleTone();
		}
		return instance;
	}
}

 

package kr.or.ddit.study06.sec05;

import java.util.Date;

public class BigLoadMain {
	public static void main(String[] args) {
		Date d1 = new Date();
//		System.out.println("1");
//		BigLoadSingleTone bst1 = new BigLoadSingleTone();
//		System.out.println("2");
//		BigLoadSingleTone bst2 = new BigLoadSingleTone();
//		System.out.println("3");
//		BigLoadSingleTone bst3 = new BigLoadSingleTone();
		
		System.out.println("1");
		BigLoadSingleTone bts1 = BigLoadSingleTone.getInstance();
		System.out.println("2");
		BigLoadSingleTone bts2 = BigLoadSingleTone.getInstance();
		System.out.println("3");
		BigLoadSingleTone bts3 = BigLoadSingleTone.getInstance();
		
		Date d2 = new Date();
		System.out.println(d2.getTime() - d1.getTime());
	}
}

 

결과 화면5 : 주석 처리한 것들을 풀고 비교하면 걸리는 시간이 다르다는 것을 알 수 있다.

 

 

package kr.or.ddit.study06.sec05;

public class SingleTemp {
	// private : 접근을 막음
	// static : 하나만 생성
	// SingleTemp : 디자인 패턴 중 하나.
	private static SingleTemp instance = null;

	private SingleTemp() {
	}

	public static SingleTemp getInstance() {
		
		if (instance == null) {
			instance = new SingleTemp();
		}
		return instance;
	}
}

 

 

package kr.or.ddit.study06.sec05;

public class SingleTon {
	private static SingleTon  instance = null;
	
	int a =1;
	
	
	private SingleTon() {  // private는 외부에서 접근 막음 (클래스내에서만 사용가능)
		System.out.println("객체가 생성됨.");
	}
	
	public int getA() {
		return ++a;
	}
	
	public static SingleTon getInstance() { // public 모든 곳에 열려있음  getInstance
		if(instance == null) {
			instance = new SingleTon();
		}
		return instance;
	}
}

 

package kr.or.ddit.study06.sec05;

public class CallSingleTon {
	public static void main(String[] args) {
		System.out.println("1번째호출");
		SingleTon singleTon1 = SingleTon.getInstance();
		System.out.println(singleTon1.getA());
		System.out.println("2번째호출");
		SingleTon singleTon2 = SingleTon.getInstance();
		System.out.println(singleTon2.getA());
		System.out.println("3번째호출");
		SingleTon singleTon3 = SingleTon.getInstance();
		System.out.println(singleTon3.getA());
		System.out.println("4번째호출");
		SingleTon singleTon4 = SingleTon.getInstance();
		System.out.println(singleTon4.getA());
	}
}

 

결과 화면6

 

 

package kr.or.ddit.study06.sec05;

public class Bank {
	private static Bank instance = null;
	
	// Bank를 private로 설정해야 SingleTon을 사용하기 적합하다. 
	public Bank() {
	}

	public static Bank getInstance() {
		if (instance == null) {
			instance = new Bank();
		}
		return instance;
	}
	
	private int money = 10000;
	
	public int getMoney(int m) {
		if(money < m) {
			System.out.println("잔고가 모자릅니다.");
			return 0;
		}
		money -= m;
		return m;
	}
}

 

package kr.or.ddit.study06.sec05;

public class BankMain {
	public static void main(String[] args) {
		// 싱글톤을 적용함
		Bank bank1 = Bank.getInstance();
		System.out.println(bank1.getMoney(3000));
		
		Bank bank2 = Bank.getInstance();
		System.out.println(bank2.getMoney(3000));
		
		Bank bank3 = Bank.getInstance();
		System.out.println(bank3.getMoney(3000));
		
		Bank bank4 = Bank.getInstance();
		System.out.println(bank4.getMoney(3000));
		
		
		// 객체가 새로 생성함 -> 잔고는 10,000인데 모두가 10,000원을 가져갈 수 있음.
//		Bank bank1 = new Bank();
//		System.out.println(bank1.getMoney(10000));
//		
//		Bank bank2 = new Bank();
//		System.out.println(bank2.getMoney(10000));
//		
//		Bank bank3 = new Bank();
//		System.out.println(bank3.getMoney(10000));
//		
//		Bank bank4 = new Bank();
//		System.out.println(bank4.getMoney(10000));
		
	}
}

 

결과 화면7

 

 

반응형
1 ··· 4 5 6 7 8 9 10 ··· 16