공부/Java

0508 분기문, 메소드, 문자열, 배열

Dev_YJ 2020. 5. 10. 18:41

*분기문 (continue, break)

-continue 문

반복문을 빠져나가지 않으면서 반복문 실행도중 다음 반복을 진행. 

기본적으로 가장 가까운 반복문으로 가지만 LABEL을 사용하면 그 반복문을 실행.

-break문

반복문을 빠져 나갈 때 사용.

하나의 반복문만 벗어나며 반복문이 아닌것은 해당x. if문(조건문) 하고는 상관 없다. 

-예제 

1부터 100까지 짝수의 합.

int sum = 0;
for(int i = 1; i<=100;i++) {
	if(i%2==0) {
		sum += i;
	}
	else {
		continue;
	}
}
System.out.println(sum);

-라벨로 분기. (이름은 아무거나 사용 가능.)

continue라벨, break라벨.

Loops : 
for(int i = 2; i<=9; i++) {
	for(int j=1; j<=9; j++) {
		if(j==5)
			//continue;
			//continue Loops;
			//break;
			break Loops;
		System.out.printf("%d * %d = %d",i,j,i*j);
		System.out.println();
	}
}

 

*메소드

-메소드의 구조.

public static in sum(inti1, inti2) {  }

public : 접근 지정자

static : 객체를 생성하지 않고 실행

int : 변환 타입

sum : 메소드 이름

int i1, int i2 : 매개변수 목록

매개 변수는 타입과 변수 이름을 써주어야 하고, 반환값도 타입이 같아야 한다.

-메소드의 호출과 반환.

return값이 없으면 void라고 알려줘야 한다.

메소드 안에 메소드를 정의하면 안됨. 각각 다른 공간에 만들기.

메소드 이름은 영어의 동사인 경우가 많으며 보통 소문자로 만든다. 

//a와 b를 합하는 메소드
public static in add(int a,int b) {
	return a+b;
    }
    
//숫자 a부터 b까지의 합을 구하는 메소드    
public static int total(int a, int b) {
	int sum = 0;
    for(int i=a; i<=b; i++) {
   		sum += i; 
        }
        return sum;

-오버로딩(overloading)

한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성. 

메소드 이름이 동일하여야 한다.

인자 개수가 다르거나 인자 타입이 서로 달라야 한다.

이름과 인자의 개수, 타입이 모두 같은데 리턴타입이 다르면 컴파일 오류 발생.

//오버로딩의 예

public static int sum(int i, int j) {
	return i + j;
}
public static int sum(int i, int j, int k) {	//인자값 3개
	return i + j + k;
}
public static double sum(double i, double j) {	//타입 다름
	return i + j;

//오버로딩의 실패

public static int sum(int i, int j) {
	return i + j;
    }
public static double sum(int i, int j) {
	return (double)(i + j);	//리턴타입은 다르지만 인자타입이 같아서 오버로딩 실패
    }

 

*참조타입

기본 데이터타입 8가지를 제외하면 나머지는 전부 참조타입.

*JVM이 사용하는 메모리 영역.

메모리 영역을 메소드 영역/ 힙(heap)영역/ JVM stack 세 영역으로 구분.

- 메소드 영역 - static

JVM 시작할 때 생성. 객체를 만들지 않아도 사용 가능

클래스 정보, 멤버 변수, static 메소드, static 변수

- 힙 영역(heap)

JVM 시작할 때 생성. 기본 8가지를 제외한 애들이 이 영역으로 간다. 객체(new로 생성한것 등)/배열 저장.

사용되지 않는 객체는 Garbage Collector가 자동 제거.

- JVM stack

stack : 집어넣은 데이터가 차곡차곡 쌓이는 것. 꺼내려면 들어간 순서의 역순으로 꺼내야 한다.

        First In Last Out (FILO),LIFO. stack에 데이터를 넣는 것을 push 꺼내는 것을 pop 이라고 한다.

스레드(thread)별로 생성.

메소드 호출할 때마다 Frame을 스택에 추가(push) - 지역변수, 매개변수, 레퍼런스 변수 저장. (자동초기화 되지 않음.)

메소드 종료하면 Frame 제거(pop).

-메모리 사용 영역 예

1. java Memory → 실행

2. JVM 구동  메소드, 힙 영역 생성

3. Memory 로딩

4. main 스레드 생성, JVM 스택 생성

5. main 메소드 호출 

*String

-문자열 선언과 생성.

단순 리터럴로 생성 String s = "Hello"; : JVM이 리터럴 관리, 응용프로그램 내에서 공유됨.

String 객체로 생성 String t = new String("Hello"); 힙 영역에 String 객체 생성.

-문자열의 비교

==와 != 연산자는 두 문자열의 내용을 비교하는 것이 아니라 동일한 객체인지 검사하는 것. 

String a = "Hello";
String b = "Java";
String c = "Hello";
String d = new String("Hello");
String e = new String ("Java");
String f = new String ("Hello");

System.out.println(a==c);	//true : 같은 객체
System.out.println(a==d);	//false : 다른 공간에 다른객체

때문에 문자열의 내용물이 같은지 확인하려면 .equals() 를 이용한다. (.equals()는 boolean타입을 return)

System.out.println(a.equals(c));	//true. 
System.out.println(a.equals(d)); 	//true.

또는

int compareTo(String anotheString) : 문자열을 사전 순으로 비교해 정수 값을 반환하는 것. 이용

System.out.println("A".compareTo("B"));	//결과 -1. A를 기준으로 간격을 정수로 반환.
System.out.println("D".compareTo("A")); //3

String a = "java"; String b = "jasa"; 
int res = a.compareTo(b); 
	if(res==0)
		System.out.println("the same"); 
	else if (res<0) 
		System.out.println(a + "<" + b); 
	else 
		System.out.println(a + ">" + b);
//결과 java>jasa

-문자열 메소드.

System.out.println("Hello".indexOf('H'));	//문자가 있는 위치를 반환. 없으면 -1
System.out.println("Hello".indexOf('o', 0));
System.out.println("Hello".concat("Java")); //concat뒤의 문자가 붙어서 출력. +연산자와 동일.
System.out.println("Hello".contains("H"));	//해당하는 글자가 있으면 true. 없으면 false
System.out.println("Hello".length());		//문자열의 길이를 반환.
System.out.println("Hello".substring(2));	//지정된 인덱스로부터 시작하는 문자열의 일부 반환. 3번째자리부터 끝까지 반환.//
System.out.println("Hello".toLowerCase());	//전부 소문자
System.out.println("Hello".toUpperCase());	//전부 대문자
System.out.println("\t\t\tHello  world  "); 	//\t은 탭: 공백이 생긴다.
System.out.println("\t\t\tHello  world  ".trim());	//문자열 안뒤의 공백문자들을 제거. 중간은 x
	

- '+' 연산자로 문자열 연결

+ 연산에 문자열이 포함되어 있으면 문자열로 연산처리.

+ 연산에 객체가 포함되어 있는 경우 :  객체.toString()을 호출해 객체를 문자열로 변환한 후 문자열 연결.

- String concat(String str)을 이용한 문자열 연결.

기존 String 객체에 연결되지 않고 새로운 String 객체 생성해 리턴.

ㄴ string s1이 abcd, s2가 efgh를 참조하고 있다가 s1.concat(s2); 이후에는 s1이 abcdefgh를 참조한다.

ㄴ abcd는 연결이 끊어져 garbage가 되어 제거된다.

-공백제거

String trim() : 스트링 앞,뒤 공백 문자(tab, enter, space)를 제거한 스트링 리턴.

String a = " abcd def ";
a = a.trim;		//결과 "abcd def"

-문자열의 문자

char charAt(int index) : index에 해당하는 char를 리턴.

String a = "class"
char c = a.charAt(2)	//결과 c = 'a'

-문자열의 길이 : .length

-문자열 연결 : .concat();

-문자열 대치 : .replace();

//String 클래스 메소드 활용
String a = new String(" abcd");
String b = new String(",efg");

a = a.concat(b);		//문자열 연결
System.out.println(a); //abcd라는 객체는 쓰레기가되어 없어진다.
a = a.trim();			//공백제거
System.out.println(a);
a = a.replace("ab", "12");	//문자열 대치
System.out.println(a);
		//문자열 분리는 지금은 넘어감.
a = a.substring(3);		//문자열 자르기. index 3번부터 맨 뒤까지 가져오기.
System.out.println(a);	
char c = a.charAt(2);
System.out.println(c);

 

*배열

-인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료구조로 한번에 많은 메모리 공간 선언 가능.

-배열에는 같은 종류의 데이터들이 순차적으로 저장된다. (반복문을 이용하여 처리하기에 적합한 자료구조.)

-배열 인덱스 : 0부터 시작. 마지막 인덱스는 배열의 크기-1. 정수 타입만 가능.

                   시작하는 위치(0)를 알고있으면 나머지에도 접근 할 수 있다. 

*배열의 선언과 생성.

int [ ] scores; 또는 int scores [ ]

scores = new int [ ] ( [ ]안은 배열의 크기를 나타낸다.). 객체들은 자동으로 0으로 초기화 되어있다.

배열의 선언, 생성, 초기화의 올바른 예시.
int[] scores = {11, 22 33, 44, 55};

int[] scores = new int[] {11, 22, 33, 44, 55};

int[] scores;
scores = new int[] {11, 22, 33, 44, 55};

잘못된 예시
int scores;
scores = {11, 22, 33, 44, 55};

-배열 원소의 접근 : 배열이름[인덱스]; (scores[1] : scores의 1번째 위치에 있는 애를 가져오기.)

-배열의 크기 : 배열이 생성도리 때 배열의 크기가 결정. 배열의 length필드가 배열의 크기를 나타낸다.(ex) scores.length

-예제

점수 10개를 저장할 수 있는 배열을 생성하고 10,20,...,100을 저장하시오. 그리고 저장된 데이터를 출력하시오.

int [] numArray = new int[10];
for(int i = 0; i<numArray.length; i++) {
	numArray[i] = (i+1)*10;
}
for(int i = 0;i<numArray.length; i++) {
	System.out.println(numArray[i]);
}

10개의 정수를 저장할 수 있는 배열을 생성하고, 1부터 100사이의 임의의 수를 생성하여 저장하고 출력하고 10개 수의 합과 평균을 구하려 출력하시오. 평균은 소수점 2자리까지.

int sum = 0;
double avg = 0;
int [] numArray = new int[10];
for(int i = 0; i<numArray.length; i++) {
	numArray[i] = ((int)(Math.random()*100))+1;
}
for(int i = 0; i<numArray.length; i++) {
	System.out.printf("%d ",numArray[i]);
	sum +=numArray[i];
	avg = sum/10.0;
}
System.out.println();
System.out.println(sum);
System.out.println("%.2f",avg);

ㄴ printf에서 소수점 두자리는 %.2f, 세자리는 %.3f로 가능.

 

키보드에서 5-10 사이의 수를 입력받아 해당하는 수만큼의 정수를 저장할 수 있는 배열을 만들고 배열에 저장된 데이터의 총합과 평균을 구하시오.

Scanner in = new Scanner(System.in);
int n = in.nextInt();
int sum = 0;
if(n>=5 && n<=10) {
	int [] keyArray = new int [n];
	for(int i = 0;i<n; i++ ) {
		keyArray[i] = in.nextInt();
		System.out.println(keyArray[i]);
		sum += keyArray[i];
		}
	System.out.println(sum);
	System.out.printf("평균은 %.2f",(double)sum/keyArray.length);
	}

ㄴ 평균을 %.2f 했으니까 (double) 꼭 붙여주기.

-예제 : 가장 큰 수 찾기.

키보드에서 입력받은 정수 5개를 배열에 저장하고 제일 큰 수를 화면에 출력하는 프로그램 작성하기

Scanner in = new Scanner(System.in);
int [] keyArray = new int[5];
int max = keyArray[0];
for(int i=0; i<keyArray.length;i++) {
	keyArray[i] = in.nextInt();
	if(keyArray[i]>max) {
		max = keyArray[i];
	}
}
System.out.printf("가장 큰 수는 %d",max);

가장 작은수

Scanner in = new Scanner(System.in);
int [] keyArray = new int[5];
int max = keyArray[0];
int min = keyArray[0];
for(int i=0; i<keyArray.length;i++) {
	keyArray[i] = in.nextInt();
	if(keyArray[i]>max) {
		max = keyArray[i];
	}
	if(keyArray[i]<min ||min==0) {
		min = keyArray[i];
	}
}
System.out.printf("가장 큰 수는 %d, 가장 작은 수는 %d",max,min);	

min값이 자꾸 0으로 출력돼서 일단 0일때도 최소값이 출력되게 조건문을 추가하긴했는데 다른 방법이 없나 봐야겠다.

-예제 

1. 배열중 짝수와 홀수의 합 각각 구하기.(1-100사이의 임의의 수를 발생하여 저장.)

int [] numArray = new int[10];
int sum_odd = 0;
int sum_even = 0;
for(int i = 0; i<numArray.length;i++) {
	numArray[i] = ((int)(Math.random()*100))+1;
	System.out.println(numArray[i]);
	if((numArray[i]%2)==0) {
		sum_even += numArray[i];
	}
	else
		sum_odd += numArray[i];
}
System.out.printf("짝수의 합은 %d, 홀수의 합은 %d",sum_even,sum_odd);

2. 정수 10개의 짝수로만 입력받고 출력하는 프로그램.

Scanner in = new Scanner(System.in);
int [] numArray = new int[10];
int n = in.nextInt();
for(int i = 0; i<numArray.length;i++) {
	n = in.nextInt();
	if(n%2==0)
		numArray[i] += n;
	else
		continue;
	System.out.println(numArray[i]);
}

*boolean과 String 배열

boolean[] boolArray = new boolean[3];
for(int i=0; i<boolArray.length;i++) {
	System.out.println(boolArray[i]);
}

//String의 기본 초기화는 null

String[] strArray = new String[3];
for(int i=0; i<strArray.length;i++) {
	strArray[i] = in.next();
}
for(int i=0; i<strArray.length;i++) {
	System.out.println(strArray[i]);
}

*split : 쪼개다. 구분자를 기준으로 쪼갠다.

String str = "This is a pencil";
String [] strArray = str.split(" ");
	for(int i = 0; i<strArray.length;i++) {
		System.out.println(strArray[i]);
}//This	// is // a // pencil 4개로 나뉘어 strArray에 저장된다. 

 

*for-each문 : 배열안의 원소들을 각각 순차적으로 방문.

int[] num = {1,2,3,4,5};
int sum = 0;
for(int k : num) //int k = num[0];
	sum+=k;	//k가 num을 순차적으로 가져온다.
System.out.println(sum);

String names []= {"사과","배","바나나","체리","딸기"};
for (String s : names)//반복할 때마다 s는 names[0],names[1],...순차적으로 접근
	System.out.print(s + " ");
    
//위에꺼랑 일치하는 포문을 적어보면.
for (int i = 0; i<names.length;i++ )
	System.out.println(names[i] + " ");

 

*main[ ] 메소드

 메소드 인자 전달 할 수 있다. run - configuration - argument에 입력.

숫자로 전달해도 문자열로 처리되기 때문에 숫자로 가공하고 싶으면 

Integer.parseInt("11");		//정수일 때
Double.parseDouble("22.");	//실수일 때

'공부 > Java' 카테고리의 다른 글

0512 클래스와 객체  (0) 2020.05.12
0511 연습문제, 예외문  (0) 2020.05.12
0507 반복문, 연습문제  (0) 2020.05.10
0506 연산자, 조건문, 반복문  (0) 2020.05.06
0501  (0) 2020.05.02