(loop -> 무한루프 조심 : 시스템 다운 / 유한루프)
for - 유한루프에 많이 사용
while - 무한루프에 많이 사용(break거는 의도적인 무한루프)
do ~ while
break / continue / label
배열 선언
ex>
int arr[] = new int[3];
int[] arr = new int[3];
배열이 가지는 각 공간들은 생성과 동시에 각 데이터 타입에 대한 기본값으로 초기화됨(보통 0이라 생각, boolean은 false)
145~146 page 그림 참조(중요)
선언한 배열의 범위를 넘으면 ArrayIndexOutOfBoundsException 에러를 발생시킨다.
public class ArrayEx3 {
public static void main(String[] args) {
int intArr[] = new int[3];
System.out.println(intArr[0]);
// Runtime Exception (컴파일 시 에러나지 않으나,
실행 시에 에러가 뜸)
System.out.println(intArr[5]);
}
}
public class ArrayEx4 {
public static void main(String[] args) {
//생성과 동시에 할당 값으로 초기화 하는 것
int intArr1[] = new int[] {10, 20, 30};
int intArr2[] = {10, 20, 30};
for(int i = 0; i < intArr2.length; i++) {
System.out.println(intArr2[i]);
}
}
}
반복적인 배열 처리할 경우 기존 for문에서 향상된 반복문 사용
String strArr[] = {"aaa", "bbb", "ccc"};
for(String data: strArr) { -->int형은 앞 data int로(각 자료형에 맞게 써주기)
System.out.println(data);
}
public class ArrayEx5 {
public static void main(String[] args) {
//다차원 배열 선언1
int[][] arr1;
arr1 = new int[3][2];
arr1[0][0] = 10;
arr1[0][1] = 20;
arr1[1][0] = 30;
arr1[1][1] = 40;
arr1[2][0] = 50;
arr1[2][1] = 60;
//다차원 배열 선언2
int arr2[][] = {{10, 20}, {30, 40}, {50, 60}};
//다차원 배열 선언3
int arr3[][] = new int[][] {{10, 20}, {30, 40}, {50, 60}};
System.out.println(arr1[0][1]);
System.out.println(arr1[1][1]);
System.out.println(arr2[0][1]);
System.out.println(arr2[1][1]);
System.out.println(arr3[0][1]);
System.out.println(arr3[1][1]);
}
}
public class ArrayEx5 {
public static void main(String[] args) {
//다차원 배열 선언
int[][] arr1;
arr1 = new int[3][4];
arr1[0][0] = 10;
arr1[1][0] = 20;
arr1[2][0] = 30;
System.out.println("arr1 :" + arr1);
System.out.println("arr1[0] :" + arr1[0]);
System.out.println(arr1[0][0]);
//반복문을 이용해서 전체 데이터 접근
System.out.println("arr1.length : " + arr1.length);
System.out.println("arr1.length : " + arr1[0].length);
for(int i=0; i<arr1.length; i++) {
for(int j = 0; j<arr1[i].length; j++) {
System.out.println(arr1[i][j]);
}
}
}
}
위의 코드와 동일 사용
for(int[] cols : arr1) { //행 먼저 반복
for(int data : cols) { //열 반복
System.out.println(data);
}
}
public class ArrayEx6 {
public static void main(String[] args) {
//3차원 배열 ex>223
int arr[][][] = {
{
{1, 2, 3},
{4, 5, 6}
},
{
{10, 20, 30},
{40, 50, 60}
},
{
{100, 200, 300},
{400, 500, 600}
}
};
for(int cols[][] : arr){
for(int rows[] : cols) {
for(int data: rows) {
System.out.println(data);
}
}
}
}
}
length가 다른 배열
public class ArrayEx5 {
public static void main(String[] args) {
int[][] arr2 = new int[4][];
arr2[0] = new int[]{1, 2, 4, 5};
arr2[1] = new int[]{10, 20, 30, 40, 50};
arr2[2] = new int[]{20, 20, 20};
arr2[3] = new int[]{30, 30, 30, 30};
}
}
이렇게 열 길이가 다른 배열을 만들 수 있다.
가변 배열 구조를 그림으로 표현하면(직접 그림 ㅋㅋ,,)
모듈 -재사용이 가능하도록 조립하는 것
모듈화는 모듈 형식으로 작업 진행한 것
추상화과정(공통 내용 추출), 속성(필드/변수), 기능(메서드) 작업(여기까지 추상화)-----문법-----> class(설계도) ----값,(구체화(객체화)),인스턴스화----> 객체(인스턴스)
기술 -> UML(Unified Modeling Language) - 모델을 만드는 표준 언어
프로그램 동작에 따라 다양한 다이어그램 나옴
이런 것들이 있다,,
사용자 정의 클래스 - 문법 익히고
내장 클래스(라이브러리, API) -> 사용법 배움
외부 클래스
class Student {
//클래스 선언
String hakbun;
String name;
int age;
double height;
double weight;
}
public class ObjectEx1 {
public static void main(String[] args) {
//객체변수 선언 / 생성
Student stu1 = new Student();
System.out.println(stu1); --> Student@2d363fb3 = 자료형@해쉬코드
stu1.hakbun = "1001";
stu1.name = "홍길동";
stu1.age = 22;
stu1.height = 180.5;
stu1.weight = 80;
//stu1과 다른 주소값 가짐, new - 객체를 새로 만든다(이름 동일해도 다른 객체)
Student stu2 = new Student(); --> Student@7d6f77cc
System.out.println(stu2);
}
}
클래스 영역(Method area, code area, static area) = 필드, 생성자. 메소드, 타입에 대한 정보, 상수 풀 등 저장 되는 영역
Field - 멤버 변수 이름, 데이터 타입 접근 제어자에 대한 정보
Method - 메소드 이름, 리턴 타입, 파라미터, 접근 제어자 등 정보
Type - 클래스 / 인터페이스 등 타입의 속성과 이름, 상위 클래스 이름 등
스택 영역 - 메소드 호출 시마다 로컬 변수들이 쌓이는 영역(스레드 별로 별도 공간 가짐)
LIFO(Last in First out)구조로 나중에 메모리에 생성된 데이터가 먼저 소멸
힙영역 - new 키워드로 생성된 객체가 저장되는 공간(스택과 달리 여러 스레드가 공유)
이 공간 객체들은 프로그램 코드로 임의로 삭제 불가하고 자동으로 (Garbage Collection) 실행될 때 삭제되어 사용하던 메모리 공간 반환됨
class MethodEx {
//단순한 메소드 선언
void dofunc1() {
System.out.println("dofunc1 호출");
}
//매개변수
void dofunc2(int data1) {
int data0 = 10;
System.out.println("dofunc2 호출 : " + data0);
System.out.println("dofunc2 호출 : " + data1);
}
//매개변수 여러개
void dofunc3(int data1, String data2) {
System.out.println("dofunc3 호출 : " + data1);
System.out.println("dofunc3 호출 : " + data2);
}
// void = return 값 없음 나타냄 / return 할 거면 return할 자료형을 함수 앞에 써준다.
int dofunc4(int data1, int data2) {
int sum = data1 + data2;
return sum;
}
}
public class MainEx1 {
public static void main(String[] args) {
MethodEx ex = new MethodEx();
// 호출
ex.dofunc1();
ex.dofunc2(10);
ex.dofunc3(20, "abc");
int result = ex.dofunc4(10, 20);
System.out.println(result);
}
}
class Util {
int viewMAXNumber(int data1, int data2, int data3) {
int max;
if(data2 <= data1 && data3 <= data1){
max = data1;
}
else if(data1 <= data2 && data3 <= data2) {
max = data2;
}
else {
max = data3;
}
return max;
}
}
public class MainEx2 {
public static void main(String[] args) {
Util vmn = new Util();
int result = vmn.viewMAXNumber(3, 2, 1);
System.out.println(result); --> 3 출력
}
}
class Util {
int calculator(int data1, String sansul, int data2) {
int result = 0;
switch(sansul) {
case "+": result = data1 + data2;
break;
case "-": result = data1 - data2;
break;
case "*": result = data1 * data2;
break;
}
return result;
}
}
public class MainEx2 {
public static void main(String[] args) {
Util util = new Util();
int result = util.calculator(3, "-", 1); --> 2 출력
System.out.println(result);
}
}
매개변수의 종류, 개수, 순서 다르면 메소드 중복 정의 가능하다.
class MethodEx {
//같은 이름 두 개의 메소드는 선언이 안됨
//But 매개변수 종류 / 개수/ 순서 다르면 허용 : 메소드 중복정의(overloading)
void doFunc(int a) {
System.out.println("doFunc(int a) 호출");
}
//위 메소드와 종류가 다른 메소드
void doFunc(String s) {
System.out.println("doFunc(String s) 호출");
}
//개수가 다른 메소드
void doFunc(int a, String s) {
System.out.println("doFunc(int a, String s) 호출");
}
//위의 메소드와 순서가 바뀐 메소드
void doFunc(String s, int a) {
System.out.println("doFunc(String s, int a) 호출");
}
}
public class MainEx3 {
public static void main(String[] args) {
MethodEx ex = new MethodEx();
ex.doFunc(10);
ex.doFunc("10");
ex.doFunc(10, "10");
ex.doFunc("10", 10);
}
}
https://docs.oracle.com/en/java/javase/11/docs/api/index.html
자바 도움말 참고 링크
... 써서 가변인자 만들 수 있다.
class MethodEx {
//가변인자 가진 함수
void doFunc1(int ... args) { // ... << 인자 개수 불확정적라는 뜻
System.out.println("doFunc1() 호출");
System.out.println(args.length);
for(int i = 0; i <args.length; i++) {
System.out.println(args[i]);
}
}
}
public class MainEx4 {
public static void main(String[] args) {
MethodEx ex = new MethodEx();
ex.doFunc1(10, 20);
ex.doFunc1(10, 20, 30);
}
}
책 179까지 복습하기