무작정 개발.Vlog

[JAVA+국비교육] Wrapper 클래스, Calendar 클래스(만년달력), 추상클래스, final

by 무작정 개발
반응형
2021.01.04(11일 차)
오늘의 수업 내용

 

 

Wrapper 클래스

  • 기본 자료형을 클래스로 사용할 수 있게 해 줌


자료형
boolean, byte, char, short, int, long, float, double
Wrapper 클래스
Boolean, Byte, Character, Short, Integer, Long, Float, Double

Java 데이터 타입
Java. 데이터 타입

 

Auto-Boxing(자료형 ->Wrapper클래스로 변환)


Auto-unBoxing(Wrapper클래스 -> 자료형으로 변환:heap -> stack)

----------------------------------------------------------------------------------

int u = 10;
float f;

f = i; // 암시적 형 변환
i = f; // 안 들어감
i = (int) f; // 명시적 형 변환. 큰 데이터를 넣기 위해서는 반드시 명시적 형 변환 필수
----------------------------------------------------------------------------------
부모(f) - 자식(i)

부모(f) = 자식(i);         o  UPCAST           들어갈 수 있다. why? 부모가 자식보다 더 큰 개념이기 때문
자식(i) = 부모(f);         x  
자식(i) = (자식) 부모(f);   o  DOWNCAST
----------------------------------------------------------------------------------

package com.day10;

//Wrapper 클래스
//기본 자료형을 클래스로 사용할 수 있게 해줌
//자료형
//boolean, byte, char, short, int, long, float, double
//Wrapper 클래스
//Boolean,Byte,Character, Short, Integer, Long, Float, Double

//Auto-Boxing(자료형 ->Wrapper클래스로 변환)
//Auto-unBoxing(Wrapper클래스 -> 자료형으로 변환:heap -> stack)
public class Test1 {

	public static void main(String[] args) {
		
		int n1 = 10;
		int n2;
		
		Integer num1;
		Integer num2 = new Integer(20);
		
		num1 = n1; //오토박싱
		n2 = num2; //오토언박싱
		
		System.out.println(n1 + ":" + num1);
		System.out.println(n2 + ":" + num2);
		
		int a = 24;
		System.out.println(a); // 24
		System.out.println(Integer.toString(a) + 10); //2410
		System.out.println(Integer.toString(a,2));//11000 (2진수로 출력)
		System.out.println(Integer.toString(a,16));//18 (16진수로 출력)
		
		
/*
 
int u = 10;
float f;

f = i; // 암시적 형변환
i = f; // 안들어감
i = (int)f; // 명시적 형변환. 큰 데이터를 넣기 위해서는 반드시 명시적 형변환 필수

----------------------------------------------------------------------------------
부모(f) - 자식(i)

부모(f) = 자식(i);         o  UPCAST           들어갈 수 있다. why? 부모가 자식보다 더 큰 개념이기때문
자식(i) = 부모(f);         x  
자식(i) = (자식)부모(f);   o  DOWNCAST
 */

	}

}

Calendar 클래스

  • 현재 컴퓨터 시스템의 날짜 및 시간을 관리
  • Calendar 클래스는 추상 클래스이기 때문에 객체 생성(new Calendar)이 불가능하다. 클래스 내 메서드를 사용하기 위해서는 메서드 앞에 클래스명을 명시.

[소속 메서드]

  • - getInstance() : 현재 시간에 포함된 모든 내용 반환
  • - get() : 주어진 달력 필드의 값을 반환할 때 사용
  • - set() : 달력 필드에 값을 입력할 때 사용
  • - add() : 달려 필드 값을 증감
  • - set(year, month, date) : 달력 필드에 년/월/일 지정
  • - get(Calendar.DAY_OF_WEEK) : 해당 일자의 요일 구하기 (요일은 숫자로 반환)
  • - getActualMaximum(Calendar.DATE) : 해당 월의 마지막 날짜 구하기 ( 숫자로 반환)

[소속 상수]

  • - YEAR : 연도
  • - MONTH : 월(0~11)
  • - DATE :
  • - DAY_OF_WEEK : 요일 (일(1)~토(7))
  • - AM_PM : 오전(0) / 오후(1)
  • - HOUR : 시간 (12시 표기)
  • - HOUR_OF_DAY : 시간 (24시 표기)
  • - MINUTE :
  • - SECOND :
package com.day10;

import java.util.Calendar;

public class Test2 {

	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance();
		
		int y = now.get(Calendar.YEAR); //년
		int m = now.get(Calendar.MONTH) + 1; // 월(0~11) + 1
		int d = now.get(Calendar.DATE); // 일
		int w = now.get(Calendar.DAY_OF_WEEK); // 주의 수(1~7) 1:월요일 ~ 7:일요일
		
		String[] week = { "일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일" };
		System.out.println(y + "-" + m + "-" + d + "-" + week[w-1]);
		
		//달의 마지막날 구하기
		int startDay = now.getActualMinimum(Calendar.DATE);
		int lastDay = now.getActualMaximum(Calendar.DATE);
		
		System.out.println(startDay + "월 마지막날:" + lastDay + "일");
		
		System.out.printf("%tF\n", now); // 2022-01-04 -> 현재 년-월-일 출력
		System.out.printf("%tT\n", now); // 11:48:38   -> 현재 시간 출력
		System.out.printf("%1$tF  %1$tT\n", now); // 위의 2줄을 1개로 합침. 1$로 합친다.
		
		// 월(0~11)  Calendar에 넣을 때는 -1해주고 꺼낼 때는 +1 해줘야함
		now.set(2021,10-1,10);
		
		y = now.get(Calendar.YEAR); //년
		m = now.get(Calendar.MONTH) + 1; // 월(0~11) + 1
		d = now.get(Calendar.DATE); // 일
		w = now.get(Calendar.DAY_OF_WEEK); // 주의 수(1~7) 1:월요일 ~ 7:일요일
		
		System.out.println(y + "-" + m + "-" + d + "-" + week[w-1]);
	}
}

Test 2 결과


자식 클래스 & 부모 클래스

자식이 부모 메서드를 Override 했으면 나에게 맞춰 메서드 내용을 바꾸도록 진행

Override 하는 순간 부모 write, 자식도 write를 갖고 있어 자식 거를 먼저 쓴다.(내 거부터 쓴다)

Override 메서드를 사용할 때, 부모 클래스의 메서드를 사용하려면 자세 메서드 앞에 super. 메서드명();으로 호출

package com.day10;

class  Test { //부모 클래스(Test)
	
	protected int a = 10, b = 20;
	
	public void write() { // 메서드  void있어서 반환값 필요없움
		
		System.out.println("Super Class write()...");
		System.out.println("a: " + a + ", b: " + b);
	}
}

class Demo extends Test { // 자식 클래스(Demo)
	
	protected int b = 30, c = 40;
	
	//부모의 메서드를 override하기
	@Override //오버라이드하면 무조건 무조건 내껄쓴다.
		public void write() { //override하는 순간 부모 write, 자식도 write를 갖고 있어 자식꺼를 먼저 쓴다.(내꺼부터 쓴다)
			System.out.println("Sub Class write()");
			System.out.println("a: " + a + ", b: " + b + ", c: " + c);
			System.out.println("super.b: " + super.b); // 20
		}
	
	public void print1() { // 메서드
		System.out.println("Sub Class print1()에서 write()호출...");
		write();
	}
	
	public void print2() { // 메서드
		System.out.println("Sub Class print1()에서 write()호출...");
		super.write(); // super를 써서 부모(Test)의 write()를 쓴다.
	}
}
public class Test5 {

	public static void main(String[] args) {
		
		Demo ob = new Demo();
		ob.write();
		ob.print1();
		ob.print2();
		
		System.out.println("ob.b : " + ob.b); //30 부모도 있고 나도 있으면 내꺼 쓴다.
		System.out.println("((Test)ob).b : " + ((Test)ob).b);
		System.out.println("=============================");
		((Test)ob).write();
	}

}

Test 5 결과

Singletion 패턴

하나의 객체만 생성해서 공유해서 사용하는 방법.

Static, Call by reference :  이 구조를 갖는 객체를 singletion 객체라고 한다.

 

package com.day10;

// Singleton  - static을 사용해서 하나의 객체만 만들어서 공유하는 거

class Sing {
	
	private static Sing ob; // static 있어서 클래스 변수
	
	public static Sing getInstance() {
		
		if(ob==null)
			ob = new Sing();
		
		return ob;
	}
}

public class Test6 {

	public static void main(String[] args) {
		
		Sing ob1 = Sing.getInstance(); // ob1이랑 ob2 주소 공유
		Sing ob2 = Sing.getInstance();
		
		if(ob1 == ob2)
			System.out.println("동일한 객체....");
	}
}

final을 붙이는 3가지 방법

  • 인스턴스 변수(멤버 변수)에 final을 붙으면 단 한 번만 초기화 가능
  • 메서드에 final을 붙이면 Override(재정의) 불가능
  • 클래스에 final을 붙이면 상속 불가능
package com.day10;

//final의 3가지 특징(특성) - 원본 코딩을 손실을 없게할 때 사용
//인스턴수변수에 final을 붙이면 단 한번만 초기화가 가능하다.
//메소드에 final을 붙이면 Override가 불가능하다
//클래스에 final을 붙이면 상속이 불가능하다.
//-------------------------------------------------------------------------------------------
//final class TestA  - 클래스에 final을 붙이면 상속 불가능(클래스에 final을 주는 경우는 거의 없다.)
class TestA {
	
	public static final double PI;	// 초기화를 안하면 오류뜸
	
	static {
		PI = 3.14; //한번 초기화하면 값을 바꿀 수 없다.
	}
	
	public double area; //instance변수
	
	public final void write(String title) {//메소드에 final을 주면 자식이 부모 메소드를 쓸수는 있어도 override를 할 수 없다.
		System.out.println(title + ":" + area);
	}
}

public class Test7 extends TestA { //부모꺼는 내꺼다.
	
	//@Override		//메소드에 final을 주면 자식이 부모 메소드를 쓸 수 없다.
	//public void write(String title) {
	//}
	
	public void circleArea(int r) {
		area = (double)r*r*PI;
	}

	public static void main(String[] args) {
		
		Test7 ob = new Test7();
		ob.circleArea(10);
		ob.write("원");
	}
}

추상 클래스

  • 메모리의 낭비 없이 클래스와 메서드를 미리 설계
  • 메서드를 재정의해서 사용
  • 추상 클래스에는 반드시 하나 이상의 추상 메서드가 있어야 하고, 일반 메서드도 만들 수 있다.
  • 메서드 명을 가져다가 사용하면 된다.
package com.day10;
//추상 클래스
//추상 클래스는 메모리의 낭비없이 클래스와 메소드를 미리 설계를 하는 것
//추상 클래스는 메소드를 재정의해서 사용
//추상 클래스에는 반드시 하나 이상의 추상 메소드가 있어야 하고, 
//일반 메소드도 만들 수 있다.
//추상 클래스는 메소드 명을 가져다가 사용하면 됨. 강제성은 띄지만 메소드명을 만드는데 노력 x
//메소드명이 동일하여 통일성

abstract class ShapeClass { //추상클래스 -  앞에는 abstract가 붙는다.
	
	abstract void draw();// 추상 메소드 - 추상클래스 안에는 추상 메소드가 1개 이상 있어야함
}


class Circle extends ShapeClass {	//추상 클래스를 상속받아서 메소드를 재정의해서 사용 

	@Override
	public void draw() {	// 
		System.out.println("원을 그린다...");
	} 
}


class  Rect extends ShapeClass {

	@Override
	public void draw() {
		System.out.println("사각형을 그린다...");
	} 
}


class Tria extends ShapeClass {

	@Override
	public void draw() {
		System.out.println("삼각형을 그린다...");
	}
}


public class Test8 {

	public static void main(String[] args) {
		
		//객체 생성
		Circle c = new Circle();
		Rect r = new Rect();
		Tria t = new Tria();
		
		c.draw();
		r.draw();
		t.draw();
		
	}

}
package com.day10;
//자바에서는 추상클래스보단 인터페이스를 더 많이 사용한다.
abstract class SortInt { // 추상클래스
	
	private int [] value; // 초기값 : null
	
	protected abstract void sorting(); // 추상 메소드 - 추상클래스 안에는 최소 1개이상 추상 메소드가 있어야 함.
	
	
	public void sort(int [] value) { // (일반)메소드
		
		this.value = value; // value 배열에 value를 넣어라
		
		sorting();
		
	}
	
	
	public int length() {	// 메서드 void 없어서 return 필요
		
		if(value==null) {
			return 0;
		}
		
		return value.length;
	}
	
	
	protected final int compare(int i, int j) {
		//if(value[i] > value[j])
		if(value[i] == value[j])
			return 0;
		else if(value[i] > value[j])
			return 1;
		else
			return -1;
	}
	
	protected final void swap(int i, int j) {
		int temp;
		temp = value[i];
		value[i] = value[j];
		value[j] = temp;
	}
	
	public void print() {
		
		if(value==null) // 만약 value에 해쉬코드가 있다면 주소를 찾아가서
			return;
		
		for(int su : value) {
			System.out.printf("%4d", su); //데이터를 출력
		}
		System.out.println();
	}
}

class SortTest extends SortInt {

	@Override
	protected void sorting() {
		
		//Selection Sort
		for(int i=0; i<length()-1; i++) {
			for(int j=i+1; j<length(); j++) {
				
				if(compare(i, j)>0) {
					swap(i, j);
				}
			}
		}
	}
}


public class Test9 {

	public static void main(String[] args) {
		
		int [] value = {50, 34, 56, 89, 23};
		
		SortTest ob = new SortTest();
		ob.sort(value);
		ob.print();	
	}
}

Q. 퀴즈 풀이

1번

년 월을 입력받아 Calendar 클래스로 만년달력을 만들기

 

package com.day10;
//문제1 번
//년월을 입력받아 Calendar클래스로 만년달력을 만들기

import java.util.Calendar;
import java.util.Scanner;

public class Test3 {

	public static void main(String[] args) {

		Calendar now = Calendar.getInstance();
		Scanner sc = new Scanner(System.in);

		int year, month, week; // 년 ,월, i, 주

		do {
			System.out.print("년도 : "); // 2021
			year = sc.nextInt();
		} while(year < 1);	// 년도는 1보다 작으면 안된다.

		do {
			System.out.print("월 : "); //12월
			month = sc.nextInt();
		} while(month < 1 || month > 12); //|| -> OR(또는) -> month가 1보다 작거나 12보다 크면

		now.set(year, month - 1, 1);//  now.set(연도, 월, 일) - set() : 달력 필드에 값을 입력할 때 사용
		week = now.get(Calendar.DAY_OF_WEEK); // - DAY_OF_WEEK : 요일 (일(1)~토(7))
		int lastDay = now.getActualMaximum(Calendar.DATE);

		System.out.printf("----------%d년 %d월-----------", year, month);
		System.out.println();
		System.out.println("\n  일  월  화  수  목  금  토");
		System.out.println("------------------------------");

		for(int i = 1; i < week; i++) {										// 공백 1칸 = 2바이트	문자 = 2바이트
			System.out.print("    "); //공백 4칸 why? 위에서 공백2칸 일/공백2칸 화 이렇게 찍었는데 둘다 4바이트로 맞춘다.
		}

		for(int i = 1; i <= lastDay; i++) {
			System.out.printf("%4d", i); // %4d는 %d가 들어가는 공간은 4바이트로 만든다

			// 한 주의 날짜가 출력되면 줄바꿈
			week++;					//week는 일요일부터~토요일
			if(week % 7 == 1) 	// 토요일 다음으로 넘어갈때 줄바꿈해서 날짜 출력
				System.out.println();
			//한 달 내부 일(1)부터 토(7) 7로 나눴을때 줄바꿈
		}

		if(week % 7 != 1) {	// 한달이 끝났을때 줄바꿈해줌
			System.out.println();
		}
		System.out.println("------------------------------");
		sc.close();
	}	
}

 

 

2번

사용자한테 년, 월, 일을 입력받아 100(x) 일 후 년, 월, 일(요일) 모양으로 출력하기
 

--------------------------------------------

예시
 
년도? 2016
월? 4
일? 20
며칠 후? 100

만 난 날 : 2016년 4월 20일 수요일
100일 후 : 2016년 7월 29일 금요일
----------------------------------------------

 

package com.day10;

import java.util.Calendar;
import java.util.Scanner;

public class Test4 {

	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance();
		Scanner sc = new Scanner(System.in);
		String[] weeks = { "일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일" };
		
		int year, month, day, whenday, week; 
		
		do {
			System.out.print("년도 : "); // 2021
			year = sc.nextInt();
		} while(year < 1);	// 년도는 1보다 작으면 안된다.

		do {
			System.out.print("월 : "); //12월
			month = sc.nextInt();
		} while(month < 1 || month > 12); //|| -> OR(또는) -> month가 1보다 작거나 12보다 크면
		
		do {
			System.out.print("일 : "); // 25일
			day = sc.nextInt();
		} while(day < 1 || day > 31);
		
		System.out.print("몇일 후? : ");
		whenday = sc.nextInt();
		now.set(year, month - 1, day);//  now.set(연도, 월, 일) - set() : 달력 필드에 값을 입력할 때 사용
		week = now.get(Calendar.DAY_OF_WEEK); // - DAY_OF_WEEK : 요일 (일(1)~토(7))
		
		System.out.println("만난 날 : " + year + "년 " + month + "월 " + day + "일 " + weeks[week-1] + "요일");
		
		now.add(Calendar.DATE, whenday); 
		year = now.get(Calendar.YEAR); //년
		month = now.get(Calendar.MONTH) + 1; // 월(0~11) + 1
		day = now.get(Calendar.DATE); // 일
		week = now.get(Calendar.DAY_OF_WEEK); // 주의 수(1~7) 1:월요일 ~ 7:일요일
		
		System.out.println(whenday + "일 후 : " + year + "년 " + month + "월 " + day + "일 " + weeks[week-1] + "요일");

	}

}

 

 


 

벌써 국비교육을 시작한 지 11일째이다.. 시간이 빠르다고 느껴진다.. ㅠㅠ  강사님이 수업 마지막에 오늘까지 배운 

리스트를 보여주셨다. 그래서 이번 주말에 이 쭉 다시 한번 복습할 예정이다.

 

더보기

1. 자바를 컴파일하고 실행하는 방법
2. 자바의 기본 자료형 및 크기
3. 삼항 연산자의 형식 및 간단한 예제 만들기
4. 제어문의 종류 및 형식을 설명하고 제어 문당 간단한 예제 하나씩 만들기
5. 배열의 개요 및 배열의 생성, 초기값을 부여하는 방법
6. 생성자, 디폴트 생성자 개요
7. 메서드 오버 로딩이란
8. private, protected, public 이란?
9. import문의 형식
10. this, super?
11. final, static
12. 상속이란?
13. Object 클래스?
14. 메서드 오버 라이딩?
15. String에 대하여 간단히 설명하고 중요 메서드 10개만 설명 또는 사용법?
16. StringBuffer에 대하여 간단히 설명
17. Calendar 클래스에 대한 간단한 설명(객체 생성 방법, 주요 메서드 등)
18. 추상 클래스?

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기