Study Web Development

11월 9일

이전으로

자바

7. 객체의 활용

7-6 추상 클래스

  1. 새 패키지 kr.s10.abstracttest 생성하고 새 클래스 Car 생성
package kr.s10.abstracttest;
// 부모 클래스; 추상 메서드를 포함하고 있으므로 추상 클래스여야 함
public abstract class Car {
	public void drive() {
		System.out.println("달리다");
	}
	public void stop() {
		System.out.println("멈추다");
	}
	// 추상 메서드; 에너지 소모량은 차 종류마다 다르고 기본값이 없으므로, 부모 클래스가 값을 지정하는 대신 자식 클래스의 구현(=오버라이딩)을 강요
	public abstract int getEnergy();
}
  1. 새 클래스 Bus 생성
package kr.s10.abstracttest;

public class Bus extends Car {
	// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
	@Override public int getEnergy() {
		return 10;
	}
	public void getPassenger() {
		System.out.println("승차합니다.");
	}
}
  1. 새 클래스 Truck 생성
package kr.s10.abstracttest;

public class Truck extends Car {
	// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
	@Override public int getEnergy() {
		return 20;
	}
	public void getProduct() {
		System.out.println("상품을 적재합니다.");
	}
}
  1. 새 클래스 FireEngine 생성
package kr.s10.abstracttest;

public class FireEngine extends Car {
	// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
	@Override public int getEnergy() {
		return 15;
	}
	public void getWater() {
		System.out.println("불을 끕니다.");
	}
}
  1. 새 클래스 CarMain 생성
package kr.s10.abstracttest;

public class CarMain {
	public static void main(String[] args) {
		// 추상 클래스는 객체 생성 불가능
		// Car car = new Car();
		
		Bus b = new Bus();
		b.drive();
		b.getPassenger();
		System.out.println("버스의 연료 소모량 : " + b.getEnergy());
		
		Truck t = new Truck();
		t.drive();
		t.getProduct();
		System.out.println("트럭의 연료 소모량 : " + t.getEnergy());
		
		FireEngine f = new FireEngine();
		f.stop();
		f.getWater();
		System.out.println("소방차의 연료 소모량 : " + f.getEnergy());
	}
}

10. 자바 기본 클래스의 이해

https://docs.oracle.com/javase/8/docs/api/index.html

10-1 String

  1. 새 자바 프로젝트 ch07-langnUtil 생성하고 새 패키지 kr.s01.string 생성 후 StringMain01 생성
package kr.s01.string;

public class StringMain01 {
	public static void main(String[] args) {
		// 암시적으로 객체 생성
		String str1 = "abc";
		String str2 = "abc";
		
		// ==를 사용하여 객체 비교; String 클래스의 경우 toString() 메서드가 재정의되어 있어 참조값을 확인할 수 없으며, hashCode() 메서드 역시 재정의되어 있어 같은 문자열이면 객체가 달라도 같은 값을 반환함
		if(str1 == str2) {
			System.out.println("str1과 str2는 같은 객체");
		}
		else {
			System.out.println("str1과 str2는 다른 객체");
		}
		
		// equals() 메서드를 사용하여 문자열 비교; Object의 equals()는 객체를 비교하지만, String의 eqauls()는 문자열을 비교하도록 재정의되어 있음
		if(str1.equals(str2)) {
			System.out.println("str1과 str2의 내용(=문자열)이 같음");
		}
		else {
			System.out.println("str1과 str2의 내용(=문자열)이 다름");
		}
		
		// 명시적으로 객체 생성
		String str3 = new String("Hello");
		String str4 = new String("Hello");
		
		// 객체 비교
		if(str3 == str4) {
			System.out.println("str3과 str4는 같은 객체");
		}
		else {
			System.out.println("str3과 str4는 다른 객체");
		}
		
		// 문자열 비교
		if(str3.equals(str4)) {
			System.out.println("str3과 str4의 내용(=문자열)이 같음");
		}
		else {
			System.out.println("str3과 str4의 내용(=문자열)이 다름");
		}
		
		// 문자열의 대소문자를 구분하지 않고 비교
		String str5 = "bus";
		String str6 = "Bus";
		if(str5.equalsIgnoreCase(str6)) {
			System.out.println("[대소문자 구분없이 비교] str5와 str6의 내용(=문자열)이 같음");
		}
		else {
			System.out.println("[대소문자 구분없이 비교] str5와 str6의 내용(=문자열)이 다름");
		}
	}
}
  1. 새 클래스 StringMain02 생성
package kr.s01.string;

public class StringMain02 {
	public static void main(String[] args) {
		String s1 = "This is false";
		
		int index = s1.indexOf('s');
		System.out.println("문자 s가 처음으로 등장한 위치 : " + index);
		index = s1.indexOf("is"); // indexOf() 메서드의 경우 반환값이 1개이므로, 문자열의 위치는 해당 문자열(=is)의 첫 번째 문자(=i)의 위치를 반환
		System.out.println("문자열 is의 위치 : " + index);
		
		index = s1.lastIndexOf('s');
		System.out.println("문자 s가 마지막으로 등장한 위치 : " + index);
		
		char c = s1.charAt(8);
		System.out.println("추출한 문자 : " + c);
		
		index = s1.indexOf('F'); // 대소문자를 구분하며, 문자열에 포함되지 않은 문자는 -1을 반환
		System.out.println(index);
		index = s1.indexOf('f');
		
		String str = s1.substring(index);
		System.out.println("소문자 f부터 끝까지의 문자열을 추출 : " + str);
		str = s1.substring(index, index+3); // 시작 인덱스는 포함하고 끝 인덱스는 포함하지 않음
		System.out.println("인덱스 8부터 인덱스 11 직전까지의 문자열 추출 : " + str);
		
		int length = s1.length();
		System.out.println("문자열 s1의 길이 : " + length);
		
		String[] array = s1.split(" "); // 공백을 구분자로 하여 문자열을 자르고 배열로 반환
		for(int i=0;i<array.length;i++) {
			System.out.println("array[" + i + "] : " + array[i]);
		}
	}
}
  1. 새 클래스 StringMain03 생성
package kr.s01.string;

public class StringMain03 {
	public static void main(String[] args) {
		String s1 = "  aBa  ";
		String s2 = "abc";
		int a = 100;
		String msg = null;
		
		// 가공
		msg = s1.toUpperCase(); // 문자열 내 소문자(=a)를 모두 대문자(=A)로 변환
		System.out.println("msg : " + msg);
		msg = s1.toLowerCase(); // 문자열 내 대문자(=B)를 모두 소문자(=b)로 변환
		System.out.println("msg : " + msg);
		msg = s1.replace("aB", "b"); // aB를 b로 치환
		System.out.println("msg : " + msg);
		msg = s1.trim(); // 자바에서 공백은 데이터로 인정되지만, 프로그래머의 필요에 따라 trim() 메서드로 공백을 제거할 수 있음
		System.out.println("msg : " + msg);
		
		// 검색
		boolean f = s1.contains("aB"); // 문자열 내에 aB가 포함되어 있으면 true, 그렇지 않으면 false를 반환
		System.out.println("f : " + f);
		f = s2.startsWith("ab"); // 문자열이 ab로 시작하면 true, 그렇지 않으면 false를 반환
		System.out.println("f : " + f);
		f = s2.endsWith("bc"); // 문자열이 bc로 끝나면 true, 그렇지 않으면 false를 반환
		System.out.println("f : " + f);
		
		// parsing
		String msg2 = String.valueOf(a); // valueOf() 메서드를 이용하여 int를 String으로 변환
		System.out.println("msg2 : " + msg2);
		String msg3 = a + ""; // 빈 문자열을 연결하여 int를 String으로 변환
		System.out.println(msg3.equals(msg2));
	}
}
  1. 새 클래스 StringMain04 생성
package kr.s01.string;

import java.util.Scanner;

public class StringMain04 {
	public static void main(String[] args) {
		/*
		 * [실습] 문자열을 한 문자씩 읽어서 역순으로 출력
		 * hello -> olleh
		 */
		Scanner input = new Scanner(System.in);
		
		System.out.print("문자열 > ");
		String s = input.nextLine();
	
		for(int i=s.length();i>0;i--) {
			System.out.print(s.charAt(i-1)); // i가 움직이는 범위(=s.length()부터 1까지)와 인덱스의 범위(=0부터 s.length()-1까지) 차이 유의
		}
		
		input.close();
	}
}
  1. 새 클래스 StringMain05 생성
package kr.s01.string;

public class StringMain05 {
	public static void main(String[] args) {
		String str = "abcMDye-4W?EWzz";
		String result = ""; // 빈 문자열로 초기화
		/*
		 * [실습] str에 저장된 문자열에서 소문자는 대문자로 변경, 대문자는 소문자로 변경해서 출력하시오.
		 * ABCmdYE-4w?ewZZ
		 * (힌트: ASCII 코드에서 65~90은 대문자, 97~122는 소문자)
		 */
		for(int i=0;i<str.length();i++) {
			char c = str.charAt(i);
			if(c>=65&&c<=90) { // 대문자
				result+=(char)(c+97-65); // 대문자를 소문자로 변경하고 result에 연결
				// result+=String.valueOf(c).toLowerCase();
			}
			else if(c>=97&&c<=122) { // 소문자
				result+=(char)(c-97+65); // 소문자를 대문자로 변경하고 result에 연결
				// result+=String.valueOf(c).toUpperCase();
			}
			else {
				result+=c;
			}
		}
		System.out.println(result);
	}
}

10-2 StringBuffer

  1. 새 클래스 StringBufferMain 생성
package kr.s01.string;

public class StringBufferMain {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("여름 덥다!!");
		System.out.println("1 : " + sb);
		
		sb.insert(2, '이'); // insert() 메서드를 이용해 인덱스 2에 문자 '이'를 삽입; 인덱스 변동 발생
		System.out.println("2 : " + sb);
		
		sb.append("가을은 "); // append() 메서드를 이용해 기존 문자열 마지막에 "가을은 "을 연결
		System.out.println("3 : " + sb);
		sb.append("시원하다!");
		System.out.println("4 : " + sb);

		sb.replace(0, 3, "여행가자!!"); // replace() 메서드를 이용해 인덱스 0부터 인덱스 2(=인덱스 3 직전)까지의 문자열을 "여행가자!!"로 대체
		System.out.println("5 : " + sb);
		
		sb.deleteCharAt(0); // deleteCharAt() 메서드를 이용해 인덱스 0의 문자를 삭제; 인덱스 변동 발생
		System.out.println("6 : " + sb);
		sb.delete(0, 3); // delete() 메서드를 이용해 인덱스 0부터 인덱스 2(=인덱스 3 직전)까지의 문자열을 삭제; 인덱스 변동 발생
		System.out.println("7 : " + sb);
		
		String str = sb.toString(); // StringBuffer에서 String으로 변환; 두 클래스는 상속 관계가 아니기 때문에 toString() 메서드를 이용
		System.out.println(str);
	}
}

10-6 Math

  1. 새 패키지 kr.s02.mathtest 생성하고 새 클래스 MathMain 생성
package kr.s02.mathtest;

public class MathMain {
	public static void main(String[] args) {
		int a = Math.abs(-10);
		System.out.println("-10의 절대값 : " + a);
		
		double b = Math.ceil(3.3);
		System.out.println("3.3의 올림 : " + b);
		
		double c = Math.floor(3.7);
		System.out.println("3.7의 버림 : " + c);
		
		int d = Math.round(3.7f); // 결과값 변수를 int로 선언했으므로 인자는 float이 되어야 함
		System.out.println("3.7의 반올림 : " + d);
		
		int e = Math.max(3, 5);
		System.out.println("3과 5 중 최댓값 : " + e);
		
		int f = Math.min(4, 7);
		System.out.println("4과 7 중 최솟값 : " + f);
	}
}

10-7 Random

  1. 새 클래스 RandomMain 생성
package kr.s02.mathtest;

import java.util.Random; // Random이 기본 클래스가 아니므로 패키지명을 생략하기 위해서는 등록해야 함

public class RandomMain {
	public static void main(String[] args) {
		String[] gift = {"스마트폰", "TV", "냉장고", "꽝!"};
		
		double ran = Math.random();
		System.out.println("발생한 난수 : " + ran);
		
		int get = (int)(ran * gift.length); // 난수의 범위를 가공하여 일의 자리가 배열의 인덱스와 동일한 범위를 갖게 하고, 강제 형변환으로 소숫점 이하 절사
		System.out.println("정수 형태의 난수 : " + get);
		System.out.println("오늘의 선물 : " + gift[get]);

		String[] luck = {"귀인을 만남", "로또 당첨", "피곤한 일", "청혼 받음"};
		
		Random r = new Random(); // Random의 메서드는 static 메서드가 아니라 객체를 생성해야 함
		get = r.nextInt(4); // 0부터 3(=4 직전)까지의 범위로 정수형 난수 발생
		System.out.println("발생한 난수 : " + get);
		System.out.println("오늘의 운세 : " + luck[get]);
	}
}

10-4 Date

  1. 새 패키지 kr.s03.date 생성하고 새 클래스 DateMain 생성
package kr.s03.date;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateMain {
	public static void main(String[] args) {
		Date now = new Date();
		System.out.println(now); // 현재 날짜 및 시간을 기본 형식으로 출력
		// System.out.println(now.toLocaleString()); // 현재 날짜 및 시간을 한국 형식으로 출력; deprecated되어 사용하지 않음
		
		DateFormat df = DateFormat.getInstance(); // 추상 클래스이므로 new 연산자 대신 static 메서드로 객체 생성
		String today = df.format(now); // Date 객체에 SHORT style 포맷을 적용하여 문자열로 반환
		System.out.println(today);
		
		df = DateFormat.getDateTimeInstance(); // 추상 클래스이므로 new 연산자 대신 static 메서드로 객체 생성
		today = df.format(now); // Date 객체에 locale을 적용하여 문자열로 반환
		System.out.println(today);
		
		SimpleDateFormat sf = new SimpleDateFormat("yyyy년 MM월 dd일 E요일 a hh:mm:ss"); // 지정한 패턴의 포매터 객체 생성; y는 연도, M은 월, d는 일, E는 요일, a는 오전/오후, h는 0~11시, m은 분, s는 초를 의미하며 yyyy는 4자리로 연도를 출력하라는 의미
		today = sf.format(now);
		System.out.println(today);		
	}
}

10-5 Calendar

  1. 새 클래스 CalendarMain01 생성
package kr.s03.date;

import java.util.Calendar;

public class CalendarMain01 {
	public static void main(String[] args) {
		Calendar today = Calendar.getInstance(); // 추상 클래스이므로 new 연산자 대신 static 메서드로 객체 생성
		System.out.println(today); // 현재 날짜 및 시간을 식별자와 값의 쌍으로 표시
		
		int year = today.get(Calendar.YEAR); // static 상수 YEAR에 대응하는 값을 int형 변수 year에 저장
		int month = today.get(Calendar.MONTH) + 1; // MONTH의 경우 내부적으로 0~11로 처리하기 때문에 11월은 10의 값을 가짐
		int date = today.get(Calendar.DATE);
		System.out.println(year + "년 " + month + "월 " + date + "일");
		
		int day = today.get(Calendar.DAY_OF_WEEK); // DAY_OF_WEEK는 1이 일요일, 7이 토요일을 의미
		/*
		String nday = ""; // 빈 문자열로 초기화
		switch(day) {
		case 1: nday = "일"; break;
		case 2: nday = "월"; break;
		case 3: nday = "화"; break;
		case 4: nday = "수"; break;
		case 5: nday = "목"; break;
		case 6: nday = "금"; break;
		case 7: nday = "토"; break;
		System.out.println(nday + "요일");
		}
		*/
		String weekday = "일월화수목금토";
		System.out.println(weekday.charAt(day + 1) + "요일");
		
		int amPm = today.get(Calendar.AM_PM); // 오전=0, 오후=1
		System.out.println(amPm == Calendar.AM ? "오전" : "오후");
		
		int hour = today.get(Calendar.HOUR); // 12시간 표기법; HOUR_OF_DAY는 24시간 표기법
		int min = today.get(Calendar.MINUTE);
		int sec = today.get(Calendar.SECOND);
		System.out.println(hour + ":" + min + ":" + sec);
	}
}

다음으로