자바의 보조 제어문 break
1. switch-case문 빠져나가기
2. 반복문 빠져나갈때 (while, for, do~while문)
- 주로 무한 루프를 빠져나올 때 break문을 이용함
- 어떤 무한루프에서 조건식을 쓰고 그 조건을 만족하면 빠져나오는게 일반적
for 무한루프 돌리는 방법 2가지
1. 초기, 증감, 조건 식 안적기
for(;;)
{
System.out.println("무한출력");
}
2. 조건 식 안적기
for (int i = 1;; i++) {
System.out.println(i + "무한출력");
if (i == 100)
break;
}
break문 주의1
- break 뒤에 다른 내용 있으면 안된다.
while(true)
{
break;
System.out.println("출력"); // 오류생김
}
break문 주의2
- break문 만나는 순간 그 밑은 아예 안보고 바로 빠져나옴
- break문의 위치를 잘 설정해야함
- 비교해보기(아래 예제2개)
while(true) {
System.out.println(i+ "무한루프");
if(i==100) break;
i++;
}
- 이러면 100번 출력
while(true) {
System.out.println(i+ "무한루프");
i++;
if(i==100) break;
}
- 이러면 99번 출력됨
* "if"나 "메소드"를 빠져나올땐 break가 아닌 return문을 써야함!!
break문 예시
- 1부터 45사이의 난수를 발생 시킬때, 6이 나올때까지 몇번 루프가 돌아가는지 구해보자
package p2022_06_24;
public class Break03 {
public static void main(String[] args) {
int i = 1;
while (true) {
i++;
int num = (int) (Math.random() * 45) + 1; // 난수발생 : 1~45
if (num == 6)
break; // 무한루프를 빠져나옴
}
System.out.println("루프횟수 : " + (i - 1));
System.out.println("프로그램 종료");
}
}
- 루프횟수에서 초기값이 0이 아니라 1이니까 -1 해줌.(한번 루프 돌아도 i값이 2가 되기때문)
continue
- 반복문 안"에서만" 사용가능!! (while, do~while, for)
- 다시 반복문으로 돌아가라는 의미
- break문처럼 반복문 가장 위에있으면 오류가 생김
- break문처럼 if문과 함께 쓰임.
for (int i = 1; i <= 10; i++) {
if (i == 5)
continue;
System.out.println("출력 : " + i);
}
- i==5일때 출력5는 실행되지 않음
- i==5일때 아래를 실행안하고 i++쪽으로 돌아감, 6이되고 다시 조건식 참이니 출력 : 6이 출력됨
메소드 호출
- 여태껏 main 메소드 안에 모든 내용을 다 집어넣었다 이젠 사용자 정의 메소드 만들고 호출해볼것
- 나중에 클래스로 객체 쓸때도 메소드는 계속 쓰므로 중요함.
메소드
- 여러가지 코드를 묶어둔 집합체
- 한번 정의된 메소드를 호출 통해서 재사용하기 위해 사용
- 어떤 언어에선 함수 라고 부른다.
- 각 언어마다 메소드 만드는 방법이 꽤 다르다.
메소드 호출 방법
- Call by Value
- Call by Reference
메소드 의미
접근제어자 공유 자료형 메소드명(매개변수)
public static void check(){
return 값;
}
접근 제어자 종류
- public
- 생략(default접근제어자)
- private
- protected
접근 제어자
- 접근 허용할지 막을지 설정
- 클래스 앞에 도 붙일수 있고, 클래스를 구성하는 3가지 필드(변수), 생성자, 메소드 앞에도 붙일 수 있다
- default : 아무 표시 안하면 default 접근제어자
- public : 모든 접근을 허용한다는 의미로 사용됨, 가장 많이 사용됨
static 자리
- 공유를 할경우, 누구나 쉽게 접근할 수 있도록 공유원할때 붙임
- static이 붙은 메소드를 정적메소드라고 불린다.
- 어제 배운 Math 클래스는 정적메소드 밖에 없었다.
+ 아직 클래스-객체 개념 안배웠기떄문에 모두 정적메소드로 해서 공부/실습할것
void 자리 = 리턴자료형 자리
- void 대신 기본자료형도 들어갈 수 있고, 참조형인 클래스, 배열, 인터페이스도 여기에 올 수 있다
- void는 값을 돌려주지 않아도 된다는 의미이므로 void 가 왔을땐 마지막의 return이란 구문을 생략 할 수있다
- 자료형이 오면 return 자료형 ; 해서 자료형에 맞는값을 반드시 돌려줘야함
ex) void대신 int란 자료형이 왔을땐 int형 값을 return으로 돌려줘야함.
메소드 명
ex) check()
- 예약어로 설정된 Class If Switch 같은건 메소드 명으로 쓰면안됨
- 메소드 쓸땐 괄호를 반드시 가져야함 . 괄호가 없는 메소드는 거의 없다.
- 괄호만 써도 되고, 메소드가 실행되는 동안 필요한 값이 전달되어야할 땐 변수를 쓴다. 기본자료형, 참조형 다 올 수 있다.
메소드 호출/반환
- 기본자료형의 경우 값을 전달한다.
ex) int형이 매개변수로 있다면 int형 값을 전달해서 호출을 해야함
- 클래스가 오면 객체를 전달해야하고, 배열이 오면 배열주소값을 전달해야한다
- void 자리에 클래스, 인터페이스, 배열등의 참조형이 올땐 주소값을 리턴해줘야 한다.
main 메소드
-main 메소드는 이름 바꾸지 못함
- public static void check(){}
- 개발자가 호출 할 수 없다 JVM이 해줌
사용자 정의 메소드 작성
- 자바는 메소드 안 메소드가 들어가는 중첩메소드 허용안함
- 즉 메인 메소드 안에 메소드가 들어갈 수 없다. (파이썬은 중첩함수 허용)
- 그러므로 메인 메소드 바깥 (위,아래) 에 메소드 작성하기
Main 메소드 호출 vs 사용자 정의 메소드 호출
- Main 메소드는 MethodEx01.class란 바이트 코드에서 JVM이 호출해줌.
- 사용자 정의 메소드는 프로그래머가 직접 호출해줘야함
static이 붙은 정적메소드 호출 vs static이 없는 메소드 호출
- static이 붙은 메소드는 그 클래스 . 해서 바로 호출 ex) Math.random()
- static이 없는 메소드는 그 클래스로부터 객체를 생성해서 . 을 해서 메소드를 호출
접근 제어자
- 같은 클래스 내에선 접근 제어자가 아무 의미 없다
- protected이든 private이든 public이든 default든 같은 클래스 내에선 다 접근 가능
- 이 클래스,메소드,변수,생성자에 접근을 허용할건지 말건지를 정해둔 것임.
- 아무것도 없어도 default 접근제어자이다
return 자료형 적는 자리
- void 가 오든지 자료형이 오든지 둘 중 하난 반드시 와야함
- void면 return구문 생략 가능 또는 return;
메소드 호출 방법
- 매개변수가 없는 check() 는 그냥 check(); 라고 호출해주면 됨.
메소드 작성 순서
- 자바는 객체지향언어라서 메소드가 적힌 순서가 상관없다
ex) check()가 main() 보다 밑에 있어도 main()에서 check() 호출 가능
- 메소드가 적혀있는 순서가 중요한 언어가 있다.
ex) 파이썬, C
static 메소드 호출
- Math는 정적메소드만 있다. 그래서 Math.random()처럼 사용함
- 원래 static 메소드 호출 시, 클래스명.메소드명() 이 원칙이지만 같은 클래스내에 있는 정적메소드를 호출시엔 클래스명을 생략 가능
ex) MethodEx01.check(); 이지만 같은 클래스 내에선 check(); 만 작성해도 됨.
+ Math메소드의 호출법
- static이 붙은 필드 = 정적 필드 만 있다
- static이 붙은 메소드 = 정적 메소드 만 있다.
- random() 메소드는 static double random() 이다.
- 그러므로 객체 생성하지 않고 Math.random()으로 호출함.
* 클래스 : 필드, 생성자, 메소드가 있다.(api문서)
static이 없다면?
MethodEx01 mx = new MethodEx01();
mx.check()
- 이런식으로 객체를 생성하여 호출해야 한다.
매개변수가 없을때 vs 매개변수가 없을때 호출
- 매개변수가 없을때 : check(); 으로 호출
- 매개변수가 있을때 : check(ck) ; 로 호출, ck는 int값이어야
static void check(int a) { //매개변수(parameter) : int a
System.out.println("전달된 값 : " + a);
}
- 즉 정수값을 전달해야 함수가 실행될때 매개변수는 스택에 자리가 잡혔다가 메소드 끝나면 지워짐
- check(30); 시 매소드 실행될때 a에게 30을 주게 되고 이 매개변수(파라미터)를 출력
* 매개변수는 지역변수
Call by Value
- 이렇게 매개변수가 기본자료형일떈 값을 전달해서 호출하는 것.
- 값 전달에 의한 메소드 호출 방식
Call by Reference
- 매개변수가 참조형 일땐 주소값을 가짐
- 주소값을 전달해서 호출
메소드 "오버로딩"
- 매소드 정의 할때 이름이 똑같음 check(), check(int a)
- 한개 클래스내 동일 이름 클래스 정의할 수 있는 것.
- 하지만 매개변수를 다르게 함으로서 구분이 가능하도록 해야한다.
지역변수 정리
- 메소드 안에서 사용되는 지역변수 = 매개변수 = 스택에 저장됨 = 메소드 종료시 삭제됨
- 블럭문 안에서 사용되었던 i 같은것도 지역변수
메소드 예시
static void check(int a, double d) {
double result = a + d;
System.out.println("전달된 값의 합 : " + result);
}
- check(10, 10.5); 로 호출 (Call by Value)값을 전달해서 호출함
- 순서에 맞게 자료형에 맞게 전달해야함 int, double 순으로
매서드의 매개변수에 참조형이 오는 경우
ex) String 클래스
static void check(String s) {
System.out.println("전달된 값 : " + s);
}
- main 에서
check("자바");
check(new String("파이썬"));
- 호출 시 둘 다 잘 출력됨.
- 바로 check("자바") 해서 객체 만들 수도 있고 new 연산자를 써서 String객체를 만들 수도 있다.
+ String클래스만 두가지 방법 모두 가능.
1. String s = "자바"
2. String s = new String("파이썬");
static void check(String s) { //String s = "자바"
System.out.println("전달된 값 : " + s);
//String s = new String("파이썬");
}
- 바로 check("자바") 해서 객체 만들 수도 있고 new 연산자를 써서 String객체를 만들 수도 있다.
Call by Reference (위 예시 참고)
- Call by Reference = 주솟값 전달에 의한 매서드 호출 방식
- 우리가 볼땐 '자바' '파이썬'을 직접 전달하는거같지만 사실 주솟값을 전달하는것
- 그 데이터가 저장된 영역의 주솟값을 메소드로 전달하는것임
- "자바' "파이썬"데이터는 모두 힙이란 영역에 저장
- 매개변수 s는 스택영역에서 "자바", "파이썬" 의 주솟값을 가지게 됨
그림
Math 클래스의 리턴자료형
- Math클래스 random() 메소드의 리턴값은 double
- 그 우리는 그것을 int 강제형변환 해서 사용했었다.
메소드 예시1
// return문 : 메소드를 호출한곳에 값을 돌려주는 역할을 한다.
static int check01()
{
System.out.println("출럭");
return 50;
System.out.println("출럭"); //오류발생
}
- 리턴이 void가 아니므로 필수, int형 값만을 돌려줘야한다. 50.5를 리턴할순X
* 리턴구문은 메소드 가장 마지막 줄에 써야한다. 아니면 오류 발생
* 저걸 check()라는 이름을 쓸 수 없다 . 맨 위에서 check()를 썼기때문에 오류 발생
check01로 만들었다.
- Main에서 check01() 로 호출하면 출력은 되지만 리턴으로 돌려받은 값을 받지 않았으므로 그 값을 쓸수 없게됨
int result = check01();
- 리턴형이 int이기 떄문에 그 값을 받는 변수도 int여야함
값 돌려받는 2가지 방법
1. System.out.println("돌려 받은 값1 : " + result);
2. System.out.println("돌려 받은 값1 : " + check01());
- check01()에서 리턴값을 돌려받자마자 바로 출력해도 된다. 변수로 안받아서 출력해도됨
메소드 예시2
- 더블형이 리턴일땐
static double check02(int a, double d)
{
double result = a + d;
return result;
}
- 이 result도 이 메소드 안의 지역변수다 그래서 이 메소드 말고 다른 메소드에선 사용가능
- main 메소드에서
double result2 = check02(50,3.14);
System.out.println("돌려 받은 값3 : " + result2);
System.out.println("돌려 받은 값4 : " + check02(50,3.14));
return
- 메소드를 호출 한 곳으로 값을 돌려줌
- static int check01 에서 int자리에 참조형이 올땐 값이 아니라 주솟값을 돌려줌!
메소드 주의
- 클래스 배열 인터페이스도 매개변수 자리, 리턴 자료형자리 들어 갈 수 있다.
- 값을 돌려받을 때는 그 메소드의 리턴 자료형과 일치하는 자료형으로 값을 받아야함.
ex) int i = sc.nextInt();
- public static void main 에서처럼 이 순서 바뀌면 안됨 접근제어자 다음 static 다음 리턴자료형 다음 함수명
- 지역변수는 다른 메서드일땐 이름같아도 충돌 발생하지 않는다
System.out.println(max(n1,n2));
System.out.println(min(n1,n2));
- 가능함
- 원래는 MethodEx03.max(n1,n2)지만 같은 클래스라 생략(max는 static 함수이므로)
메모리
- 기본 자료형들은 값을 참조형은 주소를 저장
- 기본 자료형이라 하더라도 항상 스택에만 저장되는게 아님
- 기본 자료형 중 지역변수 만 스택이란 영역에 값이 저장됨
- 멤버,정적 변수는 기본자료형이라도 스택에 저장되지 않음
메모리 예시1
- 참조형 중 클래스 중 String 클래스 예시
String name = "신용권"
- 값인 "신용권"은 힙이란 메모리에 저장되고
- 이 저장된 값의 시작 주소값을 스택 영역에서 가지고 있다
메모리 예시2
String hobby = "독서"
- "독서" 는 힙에 저장 , 그거의 시작 주소값은 참조형 변수가 가지고 있는데 그건 스택에 있다
- (name, 2312415) 이런식으로 (주솟값 : 2312415) 스택에 있는거
배열
- 동일한 타입의 데이터를 연속된 공간에 저장하는 정적인 자료구조
- 변수를 확장시킨 개념이 배열 (변수는 1개의 데이터만 저장)
- 변수가 여러개 필요할때 간결하게 쓰기 위해 배열을 쓴다.
- 10개과목 점수 입력받으려면 변수가 10개나 필요함 - > 배열을 쓰면 코드가 늘어나지 않음
- 1가지 자료형 데이터만 저장 가능
- 거의 대분의 언어는 배열을 지원함
- 배열 정의 할때도 반드시 자료형을 적어야함.
- 1차원 배열은 [] 1개 2차원은[][] 2개...
int[][] score = new int[5][3];
- 배열이름 (변수)쓰고 new를 씀 = 명시적으로 힙메모리상에 새로 공간을 만드는것
- 왼쪽이 int면 오른쪽도 int형으로 해야
배열 의미
int score[] = new int[3];
- 힙메모리에 int인 4바이트 연속된 공간을 3개를 생성하란 의미
그림
배열 기타
+ 우리가 여태껏 봤던 main 메소드의 매개변수는 String 형 1차원 배열
- main(String[] args)
- []는 자료형 뒤에 써도 되고 변수명 뒤에 써도 된다
- String[] args == String ar[] 도 가능하다
new
- 연산자 오퍼레이터
- 힙 메모리상에 배열을 위한 새로운 공간을 만들라는 의미
+ 클래스로 객체 생성할때 쓰는 new도 같은 원리로 힙 메모리 상에 새 공간 만들라는 의미임
- String 클래스만 new를 써도 되고 안써도 되지만 다른 클래스 99%는 new를 꼭 써야만 객체 생성 가능
배열의 초기화
- 배열을 정의 시 힙메모리 상의 연속된 공간은 자동 초기화 된다.
- 자료형에 따라 초기화 되는 값이 다르다
- int 형 배열을 정의하면 힙메모리상의 공간(배열)이 자동으로 0으로 초기화 된다.
- boolean 배열 은 false 로 double 배열 은 0.0 으로 int는 0 으로 초기화 됨
- 또는 원하는 할당값이 있을 때는
score[0] = 80;
score[1] = 90;
score[2] = 100;
* 지역변수는 초기화되지 않지만 참조형은 자료형에 따라 초기화 되는 값들이 있다
배열을 만드는 2가지 방법
1.
int score[] = new int[3]
2-1.
int[] score = {80,90,100};
2-2. int[] score = new int[]{80,90,100}
int[] score = new int[]{80,90,100}; // 도 가능함
1. int score[] = new int[3] 방법
- 배열에 어떤 값이 들어가야할지 아직 안정해지거나 모를때
- new가 반드시 들어가야함
2. int[] score = {80,90,100}; 방법
- 값이 정해져있을때 쓰는 방식
- 배열 선언과 동시에 초기화를 할 때 주로 사용
int[] s1 = {80,90,100};
int[] s2 = new int[]{80,90,100};
//두가지 형식으로 선언 가능하다
- 다른 자료형도 마찬가지
double[] d = {3.14,10.5,42.195}
- 같은 자료형만 가능
int[] score = {80,90,100,3.14} // 오류 발생
변수->배열->리스트
- 변수를 확장시킨게 배열이고 배열을 확장시킨게 리스트(List)
- 배열은 한가지 자료형만 가능하고 리스트 라는 자료구조를 쓰면 자료형 혼용가능, 동적으로 자료크기 늘릴수도있다
char형 배열 / String형 배열
char[] c = {'j','a','v','a','안'};
String[] str = {"java", "jsp","oracle"}
String[] str = new String[]{"java", "jsp","oracle"}
- 모두 가능
메모리 정리
- 모든 참조형으로 변수 만들땐 거의 다 new를 필수적으로 쓴다 (클래스,배열,인터페이스)
- 힙메모리상에 저장된 값은 초기화 된다!
- 스택 메모리상에 저장된 값은 초기화 되지 않음
선언 이후 값 할당
score[0] = 80; //0번 방에 80점을 할당
score[1] = 90; //1번 방에 90점을 할당
score[2] = 100; //2번 방에 90점을 할당
배열 자동초기화
- int형 배열은 자동초기화 0으로 됨
- double형 배열은 자동 초기화 0.0으로 됨
- char형 배열은 자동으로 초기값 설정이 안됨!
- char 배열은 자동으로 초기화가 되지 않는다.
- boolean 형 배열은 자동초기화 false 로 됨!
참조형 배열 예제 : String 배열
- String형 배열은 자동 초기화 null 로 됨 (초기값이 없다는 의미)
* null : 값이 없다 는 의미
배열과 반복문
- 배열을 의미있게 쓰려면 반복문을 써야(ex) 합, 곱 등 구하기
배열의 크기 구하기 : length 속성
- length란 속성 이용해서 배열의 크기 구할 수 있다.
- 메소드가 아니라서 괄호가 없다! 속성이다.
- 그 배열이름.length 하면 된다
배열의 인덱스 주의
+ 배열은 인덱스 번호가 0번 부터 시작함
- 출력시 for문 쓸때 주로 i=0 해야하는점 주의,
- <=말고 < 써야하는거도 함께 주의
배열에서의 형변환
- double형 배열 예시
double[] dd = { 3.14, 10.5, 42.195, 50 };
for (int i = 0; i < dd.length; i++) {
System.out.println(dd[i] + "\t");
}
- int형 값인 50을 넣으면? 내부적으로 double 로 바뀜(자동형변환)
- 이 반대의 경우는 안됨 double 이 int보다 크므로
- 반대로 int 형 배열에 double 형 자료를 넣어선 안됨
크기 구하는 방법 3가지의 비교(중요)
1. 배열크기 구할땐 length 속성
2. 문자열의 길이 구할땐 length() "메소드"
3. list같은 자료구조는 size() "메소드"
+ 형변환 항상 주의
double avg = (double)sum / 3; // 또는 sum/3.0
System.out.println("평균 : " + avg);
- sum은 int 형 3도 int형이라 (double)을 안쓰면 소수점 전부 짤려서 나옴.
- 살리려면 (double)을 붙여야함 또는 3.0으로 연산
+ 평균을 소수점 2째자리까지 출력하려면
System.out.printf("평균 : %.2f",avg); // 평균 : 86.67
- 실수값일땐 뒤에 f를 써줌, %.2 는 둘째자리까지 출력하란 뜻이고 셋째자리에서 반올림된다.
출력형태 정리
%b : boolean 형식으로 출력
%d : 정수 형식으로 출력
%o : 8진수 정수의 형식으로 출력
%x / %X :16진수 정수의 형식으로 출력
%f : 소수점 형식으로 출력
%c : 문자형식으로 출력
%s : 문자열 형식으로 출력
%n : 줄바꿈 기능
%e / %E : 지수 표현식의 형식으로 출력
'국비지원 과정 > JAVA' 카테고리의 다른 글
코딩 6일 / 2022.06.28 / JAVA의 클래스,객체,필드,생성자 (0) | 2022.07.01 |
---|---|
코딩 5일 / 2022.06.27 / JAVA의 배열2,참조형,클래스,객체 (0) | 2022.06.28 |
코딩 3일 / 2022.06.23 / JAVA의 제어문2, 난수발생 (0) | 2022.06.26 |
코딩 2일 / 2022.06.22 / JAVA의 변수,연산자,제어문1 (0) | 2022.06.23 |
코딩 1일 / 2022.06.21 / JAVA란,JAVA의 자료형 (0) | 2022.06.22 |