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();
}
Bus
생성package kr.s10.abstracttest;
public class Bus extends Car {
// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
@Override public int getEnergy() {
return 10;
}
public void getPassenger() {
System.out.println("승차합니다.");
}
}
Truck
생성package kr.s10.abstracttest;
public class Truck extends Car {
// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
@Override public int getEnergy() {
return 20;
}
public void getProduct() {
System.out.println("상품을 적재합니다.");
}
}
FireEngine
생성package kr.s10.abstracttest;
public class FireEngine extends Car {
// 상속받은 추상 메서드를 구현하지 않으면 오류 발생
@Override public int getEnergy() {
return 15;
}
public void getWater() {
System.out.println("불을 끕니다.");
}
}
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());
}
}
https://docs.oracle.com/javase/8/docs/api/index.html
Deprecated.
java.lang
패키지에 포함된 기본 클래스final
이 지정되어 있어 상속이 불가능==
equals()
equalsIgnoreCase()
charAt()
indexOf()
lastIndexOf()
substring()
length()
split()
toUpperCase()
toLowerCase()
replace()
trim()
contains()
true
, 그렇지 않으면 false
를 반환하는 메서드startsWith()
true
, 그렇지 않으면 false
를 반환하는 메서드endsWith()
true
, 그렇지 않으면 false
를 반환하는 메서드valueOf()
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의 내용(=문자열)이 다름");
}
}
}
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]);
}
}
}
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));
}
}
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();
}
}
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);
}
}
java.lang
패키지에 포함된 기본 클래스
insert()
append()
replace()
deleteCharAt()
delete()
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);
}
}
java.lang
패키지에 포함된 기본 클래스abs()
floor()
round()
max()
min()
random()
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);
}
}
java.util
패키지에 포함되어 있음
random()
메서드보다 다양한 방식의 난수 생성을 지원nextInt()
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]);
}
}
java.util
패키지에 포함되어 있음
java.text
패키지에 포함되어 있음
getInstance()
getDateTimeInstance()
format()
java.text
패키지에 포함되어 있음
format()
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);
}
}
java.util
패키지에 포함되어 있음
getInstance()
get()
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);
}
}