2023.03.15 : Java 기초(조건문, 배열, 객체)

이준영·2023년 3월 15일
0

조건에 의한 반복

(loop -> 무한루프 조심 : 시스템 다운 / 유한루프)

  • for - 유한루프에 많이 사용

  • while - 무한루프에 많이 사용(break거는 의도적인 무한루프)

  • do ~ while

  • break / continue / label





Java 배열

배열 선언
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문(for each문)

반복적인 배열 처리할 경우 기존 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문 사용

위의 코드와 동일 사용

        for(int[] cols : arr1) {   //행 먼저 반복
            for(int data  : cols) {  //열 반복
                System.out.println(data);
            }
        }



3차원(번외)

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};
    }
}

이렇게 열 길이가 다른 배열을 만들 수 있다.

가변 배열 구조를 그림으로 표현하면(직접 그림 ㅋㅋ,,)






객체

객체지향(중심)프로그래밍(Object Oriented Programming)


모듈화

모듈 -재사용이 가능하도록 조립하는 것
모듈화는 모듈 형식으로 작업 진행한 것

  • 추가 / 수정 / 삭제 쉬움
  • 재사용 용이
  • 이미 검증된 모듈 사용할 경우 신뢰도 높음



클래스와 객체

추상화과정(공통 내용 추출), 속성(필드/변수), 기능(메서드) 작업(여기까지 추상화)-----문법-----> class(설계도) ----값,(구체화(객체화)),인스턴스화----> 객체(인스턴스)

기술 -> UML(Unified Modeling Language) - 모델을 만드는 표준 언어

프로그램 동작에 따라 다양한 다이어그램 나옴

  • class Diagram(클래스 간 관계 나열)
  • Use case Diagram
  • Sequence Diagram 등등,,

이런 것들이 있다,,



class

사용자 정의 클래스 - 문법 익히고
내장 클래스(라이브러리, API) -> 사용법 배움
외부 클래스


ex> 클래스 선언 / 객체변수 선언 , 생성

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);
    }
}



응용 1 : 클래스 / 메소드로 3개의 매개변수에 대한 최고값 반환하기

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 출력 
    }
}



응용 2 : 매개변수 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까지 복습하기

profile
끄적끄적

0개의 댓글