본문 바로가기

수업내용

[Day9][Java] 이차원 배열 / String 클래스 메소드 / 로또 당첨 프로그램 / Calendar / OOP(Object Oriented Programming)

 

Ⅰ. 2차원 배열

 

1. 이차열 배열 선언

 

▷ 값 입력 첫 번째 방법

 

 

 

int[][] pointArr = new int[4][3];

 

 

 

-- 4행 3열인 배열을 만든다.

[0][0] [0][1] [0][2]

[1][0] [1][1] [1][2]

[2][0] [2][1] [2][2]

[3][0] [3][1] [3][2]

 

-- 행과 열에 알아보기 쉽게 숫자를 붙인 것이지 값을 입력한 게 아니다. 초기치(== 0)으로 저장되어 있다.

 

pointArr[0][0] = 10;
pointArr[0][1] = 20;
pointArr[0][2] = 30;
		
pointArr[1][0] = 40;
pointArr[1][1] = 50;
pointArr[1][2] = 60;
		
pointArr[2][0] = 70;
pointArr[2][1] = 80;
pointArr[2][2] = 90;
		
pointArr[3][0] = 100;
pointArr[3][1] = 110;
pointArr[3][2] = 120;

 

 

 

-- 배열에 값을 입력한다.

 

 

 

System.out.println("pointArr.length => " + pointArr.length);	
System.out.println("pointArr[0].length => " + pointArr[0].length);
System.out.println("pointArr[1].length => " + pointArr[1].length);

 

 

 

-- 이차원배열명.length : 행의 길이가 나온다.

-- 이차원배열명[행의 index].length : 그 행에 존재하는 열의 길이가 나온다.

 

▷결과

pointArr.length => 4

pointArr[0].length => 3

pointArr[1].length => 3

 

 

 

for(int i=0; i<pointArr.length; i++) {
			for(int j=0; j<pointArr[i].length; j++) {
				String str = (j<pointArr[i].length-1)?",":" ";
				System.out.print(pointArr[i][j]+str);
			}
			System.out.println("");
		}

 

 

 

▷결과

10,20,30

40,50,60

70,80,90

100,110,120 

 


 

▷ 열의 길이가 같지 않을 때, 따로 지정해 주는 방법

 

 

 

 

int[][] jumsuArr = new int[4][];
		jumsuArr[0] = new int[3];
		jumsuArr[1] = new int[2];
		jumsuArr[2] = new int[3];
		jumsuArr[3] = new int[3];
		
		jumsuArr[0][0] = 10;
		jumsuArr[0][1] = 20;
		jumsuArr[0][2] = 30;
		
		jumsuArr[1][0] = 40;
		jumsuArr[1][1] = 50;
		
		jumsuArr[2][0] = 70;
		jumsuArr[2][1] = 80;
		jumsuArr[2][2] = 90;
		
		jumsuArr[3][0] = 100;
		jumsuArr[3][1] = 110;
		jumsuArr[3][2] = 120;

		for(int i=0; i<jumsuArr.length; i++) {
			for(int j=0; j<jumsuArr[i].length; j++) {
				String str = (j<jumsuArr[i].length-1)?",":" ";
				System.out.print(jumsuArr[i][j]+str);
			}
			System.out.println("");
		}

 

 

 

▷결과

10,20,30

40,50

70,80,90

100,110,120

 


 

▷ 값 입력 두 번째 방법

-- 첫 번째 방법보다 더 간단하게 할 수 있다.

 

 

 

int[][] valArr = {{10,20,30},
						  {40,50},
						  {70,80,90},
						  {100,110,120} };
		
		for(int i=0; i<valArr.length; i++) {	// 4행
			for(int j=0; j<valArr[i].length; j++) {
				String str = (j<valArr[i].length-1)?",":" ";
				System.out.print(valArr[i][j]+str);
			} 
			System.out.println("");
		}

 

▷결과

10,20,30

40,50

70,80,90

100,110,120 

 


 

Ⅱ. String 클래스 메소드

 

-- char 문자열.charAt(int index) : index 위치에 있는 문자(char)를 반환

 

 

 

String str = "안녕하세요? 만나서 반갑습니다. Good Day 되세요 ^^";
char ch = str.charAt(2);
System.out.println(ch);

 

 

 

-- int index는 0부터 시작한다. ex > 안: 0, 녕:1, 하:2 

 

▷결과

 

 

 

System.out.println("== 1. char 문자열.charAt(int index) == ");
		for(int i=0; i<str.length(); i++) {
			System.out.println(str.charAt(i));
		}

 

 

 

-- 글자 하나하나를 읽어와서 출력해 준다.

 

▷결과

?

-- 뒤에 "만나서 반갑습니다. Good Day 되세요 ^^" 마찬가지로 출력된다. (길어서 생략)

 

 


 

-- char[] 문자열.toCharArray() : 문자열을 문자형(char)배열 타입으로 변환

 

 

 

char[] charArr = str.toCharArray();
		for(int i=0; i<charArr.length; i++) {
			System.out.println(charArr[i]);
		}

 

 

 

▷결과

위와 동일

 


 

-- String 문자열.substring(int beginIndex, int end Index) : 문자열 beginIndex 위치에서부터 endIndex 위치 앞까지만 문자열을 반환

 

 

 

System.out.println(str.substring(7, 13));

 

 

 

▷결과

만나서 반갑

 


 

-- String 문자열.substring(int beginIndex) : 문자열 beginIndex 위치에서부터 끝까지 문자열을 반환

 

 

 

System.out.println(str.substring(7));

 

 

 

▷결과

만나서 반갑습니다. Good Day 되세요 ^^

 


 

String[] 문자열.split("구분자") : 문자열을 구분자로 잘라서 문자열 배열 타입으로 반환

 

 

 

String food = "돌솥비빔밥,샌드위치,라면,김치오므라이스,돈까스";
String[] foodArr = food.split(",");
		
for(int i=0; i<foodArr.length; i++) {
    System.out.println(foodArr[i]);
}

 

 

 

▷결과

돌솥비빔밥

샌드위치

라면

김치오므라이스

돈까스

 


 

String food2 = "돌솥비빔밥	샌드위치	라면	김치오므라이스	돈까스";
		String[] foodArr2 = food2.split("\t");
		
		for(int i=0; i<foodArr2.length; i++) {
		System.out.println(foodArr2[i]);
		}

 

 

 

▷결과

위와 동일

 


 

System.out.println("____________________________________________\n");
		String food3 = "골뱅이.치킨.피자.햄버거.오렌지";
		String[] foodArr3 = food3.split(".");
		
		for(int i=0; i<foodArr3.length; i++) {
		System.out.println(foodArr3[i]);
		}

 

 

 

▷결과

결과 나오지 않음

 

-- 구분자를 인식 못 할 경우가 있기 때문에 구분자 앞에 \\ 써야 확실하게 인식한다.

 


 

-- 구분자가 여러 개일 경우

 

 

 

String food4 = "골뱅이,치킨.피자	햄버거,오렌지 콜라";
		String[] foodArr4 = food4.split("\\,|\\.|\\t|\\ ");
		
		for(int i=0; i<foodArr4.length; i++) {
		System.out.println(foodArr4[i]);
		}

 

 

 

▷결과

골뱅이

치킨

피자

햄버거

오렌지

콜라

 


 

-- String.join(구분자, 문자열배열명) : 문자열배열을 구분자로 합쳐서 한 개의 문자열로 반환

 

 

 

String[] nameArr = {"한석규","두석규","세석규","네석규","오석규"};
		String names = String.join("-", nameArr);
		System.out.println(names);

 

 

 

▷결과

한석규-두석규-세석규-네석규-오석규

 


 

-- 문자열.replaceAll(변경대상문자열, 새로이 변경될 문자열) : 문자열에서 변경대상문자열을 모두 새로이 변경될 문자열로 변환

 

 

 

names = names.replaceAll("석규", "SeokGyu");
		System.out.println(names);

 

 

 

▷결과

한SeokGyu-두SeokGyu-세SeokGyu-네SeokGyu-오SeokGyu

 


 

-- 문자열.replaceFirst(변경대상문자열, 새로이 변경될 문자열) : 문자열에서 변경대상문자열 중 첫 번째만 새로이 변경될 문자열로 변환해 준다

 

 

 

names = names.replaceFirst("SeokGyu", "석규");
		System.out.println(names);

 

 

 

▷결과

한석규-두SeokGyu-세SeokGyu-네SeokGyu-오SeokGyu

 


 

fileNameArr 에서 ".txt"로 끝나는 문자만 출력해 보자.

-- boolean 문자열.endsWith(찾고자하는 문자열)

-- return type은 boolean

 

 

 

String[] fileNameArr = {"안녕.hwp", "GoodMorning.txt", "행복.txt", "안녕하세요.xls"};
		
		for(int i=0; i<fileNameArr.length; i++) {
			if(fileNameArr[i].endsWith(".txt")) {
				System.out.println(fileNameArr[i]);
			}
		}

 

 

 

▷결과

GoodMorning.txt

행복.txt

 


 

fileNameArr 에서 "안녕"으로 시작하는 문자열만 출력해 보자.

 

 

 

for(int i=0; i<fileNameArr.length; i++) {
			if(fileNameArr[i].startsWith("안녕")) {
				System.out.println(fileNameArr[i]);
			}
		}

 

 

 

▷결과

안녕.hwp

안녕하세요.xls

 


 

-- String 문자열.toUpperCase() : 어떠한 문자열의 영문 소문자를 전부 대문자로 변환

 

 

 

String str1 = "My Name is Tom";
System.out.println(str1.toUpperCase());

 

 

 

▷결과

MY NAME IS TOM

 


 

-- String 문자열.toLowerCase() : 어떠한 문자열의 영문 대문자를 전부 소문자로 변환

 

 

 

String str2 = "My Name is Tom";
System.out.println(str2.toLowerCase());

 

 

 

▷결과

my name is tom

 


 

-- Boolean 문자열.equals(\"비교대상문자열\")

 

 

 

String str3 = "MY NAME IS TOM";
String str4 = "my name is tom";
System.out.println(str3.equals(str4));

 

 

 

▷결과

false

 


 

-- Boolean 문자열.equalsIgnoreCase(\"비교대상문자열\")

 

 

 

String str3 = "MY NAME IS TOM";
String str4 = "my name is tom";
System.out.println(str1.equalsIgnoreCase(str2));

 

 

▷결과

true

 


 

-- printf

 

 

 

int a = 123;
float f1 = 4.567F;
String str5 = "좋은 하루 되세요~";
		
System.out.printf("정수 a 는 %d 이고, 실수 f1 는 %f 이고, 문자열 str5 는 %s 입니다.",a,f1,str5);

 

 

 

-- %d 는 정수, %f 는 실수, %s 는 문자열을 출력한다.

-- %f(실수)는 double도 가능하다.

 

▷결과

정수 a 는 123 이고, 실수 f1 는 4.567000 이고, 문자열 str5 는 좋은 하루 되세요~ 입니다.

텍스트 추가


 

Lotto 만들기

-- 사용자 입력 번호 6개와 랜덤 로또 당첨 번호 6개를 비교하여 당첨 개수에 따라 등수가 달라지는 프로그램이다.

 

import java.util.Random;
import java.util.Scanner;

public class MainLotto {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		String[] userNumArr = new String[6];

		for(int i=0; i<userNumArr.length; i++) {
			System.out.print("▷로또번호 입력"+(i+1)+" => ");
			userNumArr[i] = sc.nextLine();
		}

		//////////////// 로또 당첨 번호 뽑기 시작 /////////////////////
		int[] ballArr = new int[45];
		int[] tempArr = new int[5];	// 기존에 뽑았던 방번호를 기억시켜두는 공간	
		
		for(int i=0; i<ballArr.length; i++) {
			ballArr[i] = i+1;	// 배열의 방마다 데이터 입력하기
								// 데이터값은 1~45 
		}
		
		for(int i=0; i<tempArr.length; i++) {
			tempArr[i] = -1;
		}
		
		String result = "";	// 랜덤하게 뽑은 공의 데이터 값(1~45)을 보여주기 위한 용도
		Random rnd = new Random();
		
		outer:
		for(int i=0; i<6; i++) {
			int idx = rnd.nextInt(44-0+1)+0;	// 방번호
			
			for(int j=0; j<tempArr.length; j++) {
				if(tempArr[j] == idx) {	// 이미 9를 뽑았는데 9를 또 뽑으면 어떻게 할지
					i--; // 위에서 시도할 횟수를 다시 한번 주어야 한다.
						 // 해주지 않으면 6번 뽑아야 하는데 중복 될수록 횟수가 1씩 줄어든다.
					continue outer;	// 새로 random하게 뽑을 수 있도록 위의 for문부터 다시 할 수 있도록 continue; 해야 한다. 
				}
			}	// end of for(j<tempArr.length)
			
			if(i<5)
			tempArr[i] = idx;	// 뽑은 공의 방번호(indxe 번호)를 기억시켜둔다. 
			
			String str = (i<5)?", ":"\n";
			result += ballArr[idx]+str;
		}	// end of for(int<6) ----------------------
		
		System.out.println("로또 1등 당첨번호 : "+result);
		
		////////////////로또 당첨 번호 뽑기 종료 /////////////////////
		
		int cnt=0;
		String[] resultArr = result.split(", ");
		for(int i=0; i<userNumArr.length; i++) {
			for(int j=0; j<resultArr.length; j++) {
			if(userNumArr[i].equals(resultArr[j])) {
				cnt++;
			}
			}	// end of for(내부)--------------
		}	// end of for(외부)--------
		
		switch (cnt) {
		case 0:
			System.out.println("당첨 해당 사항 없습니다.");
			break;
		case 1:
			System.out.println("6등");
			break;
		case 2:
			System.out.println("5등");
			break;
		case 3:
			System.out.println("4등");
			break;
		case 4:
			System.out.println("3등");
			break;
		case 5:
			System.out.println("2등");
			break;

		default:
			System.out.println("1등!");
		}
		
		sc.close();
	}

 

 

 


 

Ⅲ. Calendar

 

-- Date 클래스 보다 조금더 향상시켜서 나온 것이 Calendar 클래스이다.

-- 간단한 날짜표현에는 Date 클래스를 사용하는 것이 더 나을 수 있으며, 두 개 날짜사이의 날짜연산을 할 경우에는 메소드기능이 더 많이 추가된 

Calendar 클래스를 사용하는 것이 나을 수 있다.

 

 

 

 

Calendar currentDate = Calendar.getInstance();

 

 

 

-- 현재 날짜와 시간을 얻어온다.

 

 

 

int year = currentDate.get(Calendar.YEAR);

 

 

 

-- 현재 년도를 얻어온다.

 

 

 

 

int month = currentDate.get(Calendar.MONTH);
String strMonth = month<10?"0"+month:String.valueOf(month);

 

 

 

-- 현재 월을 얻어온다.

-- 주의해야할 것은 get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌, 0~11 이라는 것이다.

-- get(Calendar.MONTH)로 얻어오는 값이 0이면 1월을 의미하고 11이면 12월을 의미한다.

-- 그러므로 현재월을 표현하려면 ( currentDate.get(Calendar.MONTH) + 1 ) 으로 해야한다.

 

 

 

int month2 = currentDate.get(Calendar.MONTH)+1;
String strMonth2 = month2<10?"0"+month2:String.valueOf(month2);

 

 

 

-- 괄호없이 currentDate.get(Calendar.MONTH) + 1로 하면 이상한 값이 나오므로 괄호 유무를 주의해야 한다.

-- String.valueOf()는 int를 String으로 변환해 준다.

-- "0"+month2은 문자열+정수이므로 자동적으로 String으로 변환된다.

 

 


 

 

 

int day = currentDate.get(Calendar.DATE);
String strDay = day<10?"0"+day:String.valueOf(day);
     
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DATE));
System.out.println("이 달의 몇 일: " + currentDate.get(Calendar.DAY_OF_MONTH));
System.out.println("이 달의 몇 일: " + strDay);
System.out.println("이 해의 몇 일: " + currentDate.get(Calendar.DAY_OF_YEAR));

 

 

 

-- Calendar.DATE 와 Calendar.DAY_OF_MONTH 는 같다.

 

▷ 결과

이 달의 몇 일: 30

이 달의 몇 일: 30

이 달의 몇 일: 30

이 해의 몇 일: 242

 


 

System.out.println("요일(1~7, 1:일요일): " + currentDate.get(Calendar.DAY_OF_WEEK)); 
System.out.println("이 달의 몇 째 요일: " + currentDate.get(Calendar.DAY_OF_WEEK_IN_MONTH));

 

 

 

▷ 결과

요일(1~7, 1:일요일): 6

이 달의 몇 째 요일: 5

 

 

 

String dayname = "";
     switch (currentDate.get(Calendar.DAY_OF_WEEK)) {
			case 1:
				dayname = "일";
				break;
			case 2:
				dayname = "월";
				break;
			case 3:
				dayname = "화";
				break;	
			case 4:
				dayname = "수";
				break;	
			case 5:
				dayname = "목";
				break;	
			case 6:
				dayname = "금";
				break;
			case 7:
				dayname = "토";
				break;	
		}
     System.out.println("오늘은 " + dayname + "요일 입니다.");

 

 

 

-- 1:일요일, 2:월요일, 3:화요일, 4:수요일, 5:목요일, 6:금요일, 7:토요일

 

▷ 결과

오늘은 금요일 입니다.

 


 

 

 

System.out.println("오전_오후(0:오전, 1:오후): " + currentDate.get(Calendar.AM_PM));

 

 

 

▷ 결과

오전_오후(0:오전, 1:오후): 1

 

 

 

System.out.println("시간(0~11): " + currentDate.get(Calendar.HOUR));
System.out.println("시간(0~23): " + currentDate.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59): " + currentDate.get(Calendar.MINUTE));
System.out.println("초(0~59): " + currentDate.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999): " + currentDate.get(Calendar.MILLISECOND));

 

 

 

▷ 결과

시간(0~11): 0

시간(0~23): 12

분(0~59): 43

초(0~59): 9

1000분의 1초(0~999): 933

 

 

 

System.out.println("TimeZone(-12~+12): " + (currentDate.get(Calendar.ZONE_OFFSET)/(60*60*1000))); 

 

 

 

▷ 결과

TimeZone(-12~+12): 9

 


 

현재 시각을 나타내 보자.

 

▷ 첫 번째 방법

 

 

 

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("현재시각 => " + dateFormat.format(currentDate.getTime()));

 

 

 

▷ 결과

현재시각 => 2019-08-30 12:43:09

 

▷ 두 번째 방법

-- Date 클래스를 사용하여 현재시각 나타내기

 

 

 

SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
System.out.println("현재시각 1 => " + sdformat.format(now));

 

 

 

▷결과

현재시각 1 => 2019-08-30 14:13:07

 

▷ 세 번째 방법

 

 

 

String currentTime = String.format("%tF %tT %tA",now,now,now); 
		  System.out.println("현재시각 2 => "+currentTime);

 

 

 

▷결과

현재시각 2 => 2019-08-30 14:13:07 금요일

 


 

내일 시각을 나타내 보자.

 

 

 

currentDate.add(Calendar.DATE, 1); 
System.out.println("내일시각 => " + dateFormat.format(currentDate.getTime()));

 

 

 

▷ 결과

내일시각 => 2019-08-31 12:43:09

 


 

참고 ▷▷

 

날짜 타입 

format

설명

날짜 타입

format

설명

%tF

날짜를 yyyy-mm-dd 형식으로 포맷해주는 것

%td

일수를 1~31 로 출력

%tT

날짜의 시각을 HH:MM:SS 형식으로 포맷해주는 것 

%te

%td와 동일함

%tp

오전, 오후를 출력

%tk

시간을 0~23 으로 출력

%tA

요일명 출력

%tl

시간을 1~12 으로 출력

%tY

4자리 년도만 출력

%tM

분을 00~59 으로 출력

%tB

월의 이름(January, February ...)출력

%tS

초를 00~59 으로 출력

%tm

월의 01,02,03 ~~ 10,11,12 로 출력

%tZ

타임존을 출력(한국은 KST)

 


 

Ⅳ. OOP(Object Oriented Programming)

 

1. OOP의 4가지 특징

1) 속성(Inheritance) : 클래스의 재사용과 소스 코드의 중복제거를 목적으로 하는 기술

2) 상화(Abstraction) : 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술

3) 슐화(EnCapsulation) : 객체지향의 가장 중요한 데이터 보호 기술

4) 형성(Polymorphism) : 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술

 

-- 일반적인 의미의 추상화란 어떤 물체(object)에서 주된 특징을 부각시켜 표현하고, 나머지 부분은 과감하게 생략하는것을 말한다.

-- 어떤 하나의 물체를 대표하는 속성(명사, 멤버변수)과 기능(동사, 메소드)을 추출해내는 것을 객체지향 프로그래밍(OOP)에서

"추상화" 라고 한다.

-- 예를 들어, 구인구직 프로그래밍을 만든다고 하자. 구직자 클래스의 속성을 정할 때 발 사이즈나 혈액형은 구직자에 포함된 속성이지만 구직을 할 때에는 필요하지 않는 속성이다. 따라서 구직 프로그래밍을 만드는 데에 필요한 속성과 기능을 추출하는 과정이 필요하다.