-> 주소값을 갖고 있다.
문자열
literal("") 생성 가능
문자열 편집(수정)을 할 수 없다.
비교시
== 사용하면 reference(참조값)을 비교 한다
equals() 사용하면 문자열의 내용을 비교한다.
※ 문자열 자체가 reference(참조값) 이다.
※ 똑같은 내용의 문자열 리터럴은 메모리에 한번만 생성된다. new는 할 때마다 메모리에 생성 된다
String 타입이 Buffer 타입으로 들어갈 수 없다.
new 해서 써야된다.
문자열
문자열 편집이 가능
문자열을 분리할 때 사용
분리된 문자열을 Token이라고 한다.
StringTokenizer는 비어있는 값은 무시하고 split()는 비어있는 값도 인식한다.
index
내가 찾은 위치에서 앞 글자배열의 번호
숙제 했던거 다른 방법으로 풀어 봄
package class_;
import java.util.Scanner;
public class StringMain2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("문자열 입력: ");
String original = scan.nextLine();
System.out.print("현재 문자열 입력: ");
String current = scan.nextLine();
System.out.print("바꿀 문자열 입력: ");
String change = scan.nextLine();
if (original.length()<current.length()){
System.out.println("입력한 문자열의 크기가 작습니다.");
System.out.println("치환 할 수 없습니다");
//System.exit(0); //프로그램 강제 종료
return;//메소드를 벗어나라
}
original = original.toLowerCase();
current = current.toLowerCase();
int index = 0;
int count = 0;
while((index = original.indexOf(current, index)) != -1) {
index = index +2;
count++;
}// while문 끝
System.out.println(original.replace(current, change));
System.out.println(count + "번 치환");
}
}
package constructor;
import java.util.Scanner;
public class MemberService { // 딱 1인분만 한다.
//배열로 만든다
Scanner scan = new Scanner(System.in);
MemberDTO[] ar = new MemberDTO[3];
public MemberService() {
System.out.println("기본 생성자");
}
public void menu(){
int num;
while(true) {
System.out.println();
System.out.println("***********");
System.out.println(" 1. 가입");
System.out.println(" 2. 출력");
System.out.println(" 3. 수정");
System.out.println(" 4. 삭제");
System.out.println(" 5. 끝");
System.out.println("***********");
System.out.print (" 번호 : ");
num = scan.nextInt();
if(num==5) break; // while문을 벗어나라
if(num==1)
insert(); //가입하러 가세요;
else if(num==2)
display();
else if(num==3)
update();
else if(num==4)
delete();
}
}
public void insert() {
int i;
for(i=0; i<ar.length; i++) {
if(ar[i] == null) System.out.println(ar[i]); // 주소값 출력
주소값을 출력함
.toString( )과 같은 값을 출력
package constructor;
import java.util.Scanner;
public class MemberService_T { // 딱 1인분만 한다.
//배열로 만든다
Scanner scan = new Scanner(System.in);
MemberDTO_T[] ar = new MemberDTO_T[3];
public MemberService_T() {
System.out.println("기본 생성자");
}
public void menu(){
int num;
while(true) {
System.out.println();
System.out.println("***********");
System.out.println(" 1. 가입");
System.out.println(" 2. 출력");
System.out.println(" 3. 수정");
System.out.println(" 4. 삭제");
System.out.println(" 5. 끝");
System.out.println("***********");
System.out.print (" 번호 : ");
num = scan.nextInt();
if(num==5) break; // while문을 벗어나라
if(num==1)
insert(); //가입하러 가세요;
else if(num==2)
display();
else if(num==3)
update();
else if(num==4)
delete();
}
}
public void insert() {
int i;
for(i=0; i<ar.length; i++) {
if(ar[i] == null) {
System.out.print("이름 입력 : ");
String name = scan.next();
System.out.print("나이 입력 : ");
int age = scan.nextInt();
System.out.print("핸드폰 입력 : ");
String phone = scan.next();
System.out.print("주소 입력 : ");
String address = scan.next();
ar[i] = new MemberDTO_T(name, age, phone, address);
System.out.println("가입 완료");
break; // for문을 벗어나라
} //if문
}// for문
if(i == ar.length) {
System.out.println("회원 마감");
}
}
public void display() {
int i;
for(i=0; i<ar.length; i++) {
if(ar[i] == null) System.out.println(ar[i]); // 주소값 출력
}
}
public void update() {
System.out.println("핸드폰 번호 입력 : ");
String phone = scan.next();
int i;
for(i=0; i<ar.length; i++) {
if(ar[i] == null) {
if(ar[i].getPhone().equals(phone)) {
System.out.println(ar[i]);
System.out.print("수정 할 이름 입력 : ");
String name = scan.next();
System.out.print("수정 할 나이 입력 : ");
int age = scan.nextInt();
System.out.print("수정 할 핸드폰 입력 : ");
phone = scan.next();
System.out.print("수정 할 주소 입력 : ");
String address = scan.next();
//수정
ar[i].setName(name);
ar[i].setAge(age);
ar[i].setPhone(phone);
ar[i].setAddress(address);
System.out.println("회원 정보 수정 완료");
break;
}
}
} //if문
}// for문
public void delete() {
System.out.println("핸드폰 번호 입력 : ");
String phone = scan.next();
int i;
for(i=0; i<ar.length; i++) {
if(ar[i] == null) {
if(ar[i].getPhone().equals(phone)) {
ar[i] = null;
System.out.println("회원 정보 삭제 완료");
return;
}
}
}
if(i == ar.length) System.out.println("회원 정보를 찾을 수 없습니다.");
}
}
잘 작동 함.
0 <= 난수 < 1
컴퓨터가 불규칙하게 발생시키는 수
만약 x ~ y 사이의 난수를 발생시키고 싶다면
System.out.println((int)(Math.random() * (y - x + 1)) + x);
문자로 하려면 괄호를 이렇게 변경해야 한다..
System.out.println((char)(Math.random() * 26 + 65));
package constructor;
public class ImportStatic {
public static void main(String[] args) {
System.out.println(Math.random()); //난수 발생 시켜 보도록 할게
System.out.println((int)(Math.random() * (90 - 65 + 1)) + 65); //65~90 사이의 난수
System.out.println((char)(Math.random() * 26 + 65)); // 아스키 코드 65~90(A~Z) - 괄호 잘 보세요
System.out.println(Math.pow(3, 4)); // 3의 4승 -> pow함수가 실수형으로 바꿔서 준다.
System.out.println(String.format("%.2f", 12.567)); // 뒤에 수를 소숫점 둘째 자리까지 출력(반올림 하면서)
}
}
몇글자 안쓰겠다고 import하고 안쓸 수 있긴 함
package constructor;
import static java.lang.Math.random;
import static java.lang.Math.pow;
import static java.lang.String.format;
public class ImportStatic {
public static void main(String[] args) {
System.out.println(random()); //난수 발생 시켜 보도록 할게
System.out.println((int)(random() * (90 - 65 + 1)) + 65); //65~90 사이의 난수
System.out.println((char)(random() * 26 + 65)); // 아스키 코드 65~90(A~Z) - 괄호 잘 보세요
System.out.println(pow(3, 4)); // 3의 4승 -> pow함수가 실수형으로 바꿔서 준다.
System.out.println(format("%.2f", 12.567)); // 뒤에 수를 소숫점 둘째 자리까지 출력(반올림 하면서)
}
}
+
import static java.lang.System.out;
import static java.lang.System.out;
public class ImportStatic {
public static void main(String[] args) {
out.println(random()); //난수 발생 시켜 보도록 할게
out.println((int)(random() * (90 - 65 + 1)) + 65); //65~90 사이의 난수
out.println((char)(random() * 26 + 65)); // 아스키 코드 65~90(A~Z) - 괄호 잘 보세요
out.println(pow(3, 4)); // 3의 4승 -> pow함수가 실수형으로 바꿔서 준다.
out.println(format("%.2f", 12.567)); // 뒤에 수를 소숫점 둘째 자리까지 출력(반올림 하면서)
}
}
+
import java.util.Random;
Random r = new Random();
System.out.println(r.nextDouble()); // 0 <= 난수 < 1
System.out.println(r.nextInt()); // 음수~양수
System.out.println(r.nextInt(100)); // 오버로드 0 ~ 99
}
}
final 변수는 값을 변경할 수 없다.
final 변수는 반드시 초기값을 주어야 한다. final 필드는 생성자에서 초기값을 주어야 한다
static final 필드는 static 구역에서 초기값을 주어야 한다
final 변수는 대문자로만 기술
final 메소드는 Override를 할 수 없다. 5. final 클래스는 자식클래스를 가질 수 없다.- 상속이 안된다
package inheritance;
enum Color{ // 상수들의 집합체 만들어 버리기 ; 없이 나열만 하면 됨
RED, GREEN, BLUE, CYAN, NAGENTA
}
//---------------------
class Final{
public final String APPLE = "사과";
public final String STRAWBERRY;
public static final String LION = "사자";
public static final String TIGER; // static 은 절대 생성되고 초기화가 안되서 static에서 초기화 해야됨
// public static final int RED = 0;
// public static final int GREEN = 1;
// public static final int BLUE = 2;
// public static final int CYAN = 3;
// public static final int NAGENTA = 4;
public Final() { // 생성자로 가서 초기화를 시켜주고 값을 설정
// (생성자의 주 목적 = 초기화!!!!!!!!!!!!!)
STRAWBERRY = "딸기";
}
static {
TIGER = "호랑이";
}
}
//----------------------------------------
public class FinalMain {
public static void main(String[] args) {
final int A = 10;
// A++; -error
System.out.println("A = " + A);
final int B;
B = 20;
System.out.println("B = " + B);
System.out.println("----------------------");
Final f = new Final();
System.out.println("FRUIT = " + f.APPLE); // static이 없으면 무조건 new!!!!!!!!!!!!!!
System.out.println("STRAWBERRY = " + f.STRAWBERRY);
System.out.println("----------------------");
System.out.println("LION = " + Final.LION);
System.out.println("LION = " + f.LION);
//둘 다 오케이 static 으로 생성해서 Final.도 가능
System.out.println("LION = " + f.TIGER);
System.out.println("----------------------");
System.out.println("빨강 = " + Color.RED);
System.out.println("빨강 = " + Color.RED.ordinal()); // 빨강이 무슨 숫자를 가지고 있는지 궁금함.
System.out.println("----------------------");
for(Color c : Color.values()) { //확장형 for문이라 Color.values()가 : 앞에 애에게 값을 넘겨줌
System.out.println(c + "\t" + c.ordinal());
서로 관련이 있는 *.class 파일들의 모임
맨 첫줄에 1번만 기술할 수 있다
소문자로 기입
자바가 제공하는 기본 패키지 java.lang (default package)
이다
package com.zoo;
public class Zoo {
public void tiger() {
System.out.println("무서운 호랑이");
}
}
-------------------------------------------
package com.apple;
import com.zoo.Zoo;
public class Apple {
public static void main(String[] args) {
System.out.println("빨강 사과");
// Zoo클래스에서 tiger( )메소드를 호출
Zoo z = new Zoo();
z.tiger();
}
}
※ default라고 직접 쓰는 것이 아니라 -> public, protected, private 를 쓰지 않은 상태
※ protected는 다른 패키지에서 Sub 클래스라면 접근이 가능하다
단, Sub 클래스로 생성해야만 한다. Super클래스로 생성하면 접근이 안 된다.
package com.zoo;
public class Zoo {
public void tiger() {
System.out.println("무서운 호랑이");
}
protected void giraffe() {
System.out.println("목이 긴 기린");
}
void elepthant() {
System.out.println("뚱뚱한 코끼리");
}
private void lion() {
System.out.println("멋진 사자");
}
}
만약 같은 패키지에 있다면 private인 lion 빼고는 다 볼 수 있다.
할머니 클래스는 자기 자식이 누가 있는지 모름.
추상화 작업
메소드에 body { } 가 없는 메소드를 추상메소드라고 한다. 추상메소드에는 abstract 라는 키워드를 써야 한다
추상메소드는 { } body 없이 ;를 써야한다
추상메소드가 있는 클래스는 반드시 추상클래스이어야 한다.
추상메소드가 없는 추상클래스를 의미상의 추상클래스라고 한다. 의미상의 추상클래스의 메소드는 모두 빈 body로 되어 있다.
추상클래스는 자신의 클래스로 메모리 생성을 할 수 없다
=> 생성하려면
가. Sub(자식) Class를 이용 (반드시 Sub Class가 추상메소드를 Override 해야 한다)
나. 메소드를 이용
추상메소드는 반드시 Sub Class에서 Override 꼭 해 주어야 한다. Override를 안하면 Sub Class 마저도 abstract 가 되어야 한다.
ex) 12월 1일 만두 가게 오픈할 예정 -> 현재 가게 없음(현재 메소드 없음) = 추상
추상메소드를 만들면 클래스도 추상이여야 함.
-> 방법은 강제로 상속관계 만들기
package abstract_;
public abstract class AbstractTest { // POJO(Plain Old Java Object) 형식이에요 = 완전 기본이다~
String name; // 나만 쓸래 상속안해
public String getName() { // 구현
return name;
}
public abstract void setName(String name); // 추상 메소드 - { }있어야 하는데 그냥 ; 박아버림
}
--------------------------------------------------------------
package abstract_;
public class AbstractMain extends AbstractTest{ // 그대로 물려받아 추상으로 만들어 줘야 된다.
-> 그런데 abstract 빼야지 AbstractTest at = new AbstractMain();
가능 이유는 아직 현실화되지 않아서 new가 불가능
@Override
public void setName(String name) {
this.name = name; // private 이여서 -> protected or defalt로 만들어주면 사용 가능
}
public static void main(String[] args) {
// AbstractTest at = new AbstractTest(); // 추상 클래스의 가장 큰 특징 절대 new할 수 없다.
AbstractTest at = new AbstractMain();
at.setName("문이빈");
System.out.println(at.getName());
}
}
생각지도 않은 error가 발생하여 프로그램이 중도에 멈추는 것을 미리 예방하는 것
예외처리의 최 상위 클래스는 Exception 이다.
Exception이 여러 개 발생을 하면 한 번에 최 상위 클래스 Exception으로 처리하는 것이 편하다.
자바가 제공하는 Override한 메소드에는 throws 사용해서는 안된다.
1. try {
error가 발생할 가능성이 있는 영역
} catch( ){
error가 발생하면 처리되는 부분
}
2. try {
}catch( ) {
}catch( ) {
}
3. try {
} catch( ) {
} finally {
error가 있건 없건 무조건 실행하는 부분
}
throws - JVM에게 떠넘기는 것
throw - 사용자가 직접 Exception을 작성하여 발생
package abstract_;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Today {
public static void main(String[] args) throws ParseException {
Date date = new Date();
System.out.println("오늘 날짜 : " + date);
SimpleDateFormat sdf = new SimpleDateFormat("y년 MM월 dd일 HH:mm:ss E요일");
// 2023년 07월 21일 (작성방법 구글링~)
System.out.println("오늘 날짜 : " + sdf.format(date));
// 내 생일
SimpleDateFormat input = new SimpleDateFormat("yyyyMMdd");
Date birth = input.parse("19960706");
// input.parse = 문자열을 date형식으로 바꾸는 메소드 -> 예외 처리
System.out.println("내 생일 : " + birth);
System.out.println("내 생일 : " + sdf.format(birth));
System.out.println();
// 시스템 날짜를 기준으로 생성이 된다.
//Calendar cal = new Calendar(); -error // 추상 클래스라 직접적으로 new가 불가능 방법은 밑에 처럼
//Calendar cal = new GregorianCalendar(); // 자식 클래스를 이용하여 생성함.
Calendar cal = Calendar.getInstance(); // 메소드를 이용하여 클래스 생성
int year = cal.get(Calendar.YEAR); //년 꺼내기year / cal.get(1);
int month = cal.get(Calendar.MONTH)+1; //월 꺼내기 => 1월 = 0 , 2월 = 1 / cal.get(1)+1;
int day = cal.get(Calendar.DAY_OF_MONTH); // 헛갈려 그냥 지정해버리기~
int week = cal.get(Calendar.DAY_OF_WEEK); // 일-1, 월-2, 화-3
String dayOfWeek = null;
switch(week) {
case 1 : dayOfWeek = "일"; break;
case 2 : dayOfWeek = "월"; break;
case 3 : dayOfWeek = "화"; break;
case 4 : dayOfWeek = "수"; break;
case 5 : dayOfWeek = "목"; break;
case 6 : dayOfWeek = "금"; break;
case 7 : dayOfWeek = "토";
}
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
System.out.println(year + "년 " + month + "월 " + day + "일" + dayOfWeek);
System.out.println(hour + "시 " + minute + "분 " + second + "초");
}
}
package abstract_;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class NumberMain {
public static void main(String[] args) {
// NumberFormat nf = new NumberFormat(); -error => 추상 클래스라 생성이 안됨
// DecimalFormat - 3자리 마다 ,를 찍어준다. 근데 말 안해도 소수점 3째자리 까지 제공(반올림한 상태로)
NumberFormat nf = new DecimalFormat(); // 그래서 자식 클래스를 가지고 와서 생성
System.out.println(nf.format(12345678.456789));
System.out.println(nf.format(12345678));
System.out.println();
// 내가 원하는 대로 숫자 적을래~~ => 유효 숫자가 아닌 것은 표시하지 않는다.
NumberFormat nf2 = new DecimalFormat("#,###.##원");
System.out.println(nf2.format(12345678.456789));
System.out.println(nf2.format(12345678));
System.out.println();
// 강제로 0을 표시
NumberFormat nf3 = new DecimalFormat("#,###.00원");
System.out.println(nf3.format(12345678.456789));
System.out.println(nf3.format(12345678));
System.out.println();
// NumberFormat nf4 = NumberFormat.getInstance(); //메소드를 이용하여 생성
NumberFormat nf4 = NumberFormat.getCurrencyInstance();
nf4.setMaximumFractionDigits(2); //소수이하 2째자리
nf4.setMinimumFractionDigits(2); //0을 강제로 표시 2자리까지
System.out.println(nf4.format(12345678.456789));
System.out.println(nf4.format(12345678));
System.out.println();
// NumberFormat nf4 = NumberFormat.getInstance(); //메소드를 이용하여 생성
NumberFormat nf5 = NumberFormat.getCurrencyInstance(Locale.US);
nf5.setMaximumFractionDigits(2); //소수이하 2째자리
nf5.setMinimumFractionDigits(2); //0을 강제로 표시 2자리까지
System.out.println(nf5.format(12345678.456789));
System.out.println(nf5.format(12345678));
System.out.println();
}
}
[문제] 만년달력
- 년도, 월을 입력하여 달력을 작성하시오
클래스명 : CalendarEx
필드 :
메소드 - 기본 생성자 : 월, 일을 입력
calc() : 매달 1일의 요일이 무엇인지? (Calendar에 메소드 준비 - 구글링)
매달 마지막이 28, 29, 30, 31 무엇인지? (Calendar에 메소드 준비 - 구글링)
display() : 출력
클래스명 : CalendarMain
[실행결과]
년도 입력 : 2002
월 입력 : 10
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
package abstract_;
import java.util.Calendar;
import java.util.Scanner;
class CalendarEx {
private int year;
private int month;
// 월, 일을 입력하는 생성자
public CalendarEx(int year, int month) {
this.year = year;
this.month = month;
}
// 매달 1일의 요일을 계산하는 메소드
public int mon1() {
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, 1); // 월은 0부터 시작하므로 month - 1
return cal.get(Calendar.DAY_OF_WEEK);
}
// 매달 마지막 날짜를 계산하는 메소드
public int lastday() {
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1); // 다음 달 1일로 설정
cal.add(Calendar.DATE, -1); // 하루를 빼서 이전 달의 마지막 날짜로 변경
return cal.get(Calendar.DATE);
}
// 달력을 출력하는 메소드
public void display() {
System.out.println("일\t월\t화\t수\t목\t금\t토");
int firstDay = mon1();
int lastDay = lastday();
// 첫 번째 날짜 이전의 공백 출력
for (int i = 1; i < firstDay; i++) {
System.out.print("\t");
}
// 날짜 출력
for (int day = 1; day <= lastDay; day++) {
System.out.print(day + "\t");
// 토요일이면 줄바꿈
if ((firstDay + day - 1) % 7 == 0) {
System.out.println();
}
}
System.out.println();
}
}
//-----------------------------------------
public class CalendarMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("월 입력: ");
int month = scanner.nextInt();
System.out.print("일 입력: ");
int day = scanner.nextInt();
CalendarEx cal = new CalendarEx(month, day);
cal.display();
scanner.close();
}
}
[문제] 사지선다형
- 총 5문제의 답을 입력받는다
- 정답은 "11111" 이다
- 맞으면 'O', 틀리면 'X'
- 1문제당 점수는 20점씩 처리
클래스명 : Exam
* 필드
private String name;
private String dap;
private char[] ox;
private int score;
public static final String JUNG = "11111"; //상수화
* 메소드
생성자 - Scanner 를 이용하여 이름과 답을 입력받는다.
compare() - 비교
getName()
getOx()
getScore()
클래스명 : ExamMain
[실행결과]
인원수 입력 : 2
이름 입력 : 홍길동
답 입력 : 12311
이름 입력 : 코난
답 입력 : 24331
이름 1 2 3 4 5 점수
홍길동 O X X O O 60
코난 X X X X O 20
package constructor;
import java.util.Scanner;
public class Exam {
private String name;
private String dap;
private char[] ox;
private int score;
public static final String JUNG = "11111";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDap() {
return dap;
}
public void setDap(String dap) {
this.dap = dap;
}
public char[] getOx() {
return ox;
}
public void setOx(char[] ox) {
this.ox = ox;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public static String getJung() {
return JUNG;
}
Scanner scan = new Scanner(System.in);
public void con() {
System.out.println("이름 입력 : " + name);
name = scan.next();
System.out.println("답 입력 : " + dap);
dap = scan.next();
compare();
}
public void compare() {
ox = new char[dap.length()];
score = 0;
for (int i = 0; i < dap.length(); i++) {
if (dap.charAt(i) == JUNG.charAt(i)) {
ox[i] = 'O';
score += 20;
} else {
ox[i] = 'X';
}
}
}
}
-----------------------------------------------------------
package constructor;
import java.util.Scanner;
public class ExamMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("인원수 입력: ");
int count = scanner.nextInt();
Exam[] exams = new Exam[count];
for (int i = 0; i < count; i++) {
exams[i] = new Exam(scanner);
}
System.out.println("\n이름\t1 2 3 4 5\t점수");
for (Exam exam : exams) {
System.out.print(exam.getName() + "\t");
char[] ox = exam.getOx();
for (char c : ox) {
System.out.print(c + " ");
}
System.out.println("\t" + exam.getScore());
}
scanner.close();
}
}