ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 221208 자바2(반복문, 배열, 객체지향 프로그래밍)
    스타터스 백엔드 3기 2022. 12. 8. 16:20

    하루입니다.

    ForTest, MainTest, StudentTest

     


     

    복습

    기본형 변수 : 스택에 실제 리터럴값을 저장한다.
    참조형 변수 : 스택에 주소값을 저장한다.
    연산자 : 형변환연산자
      -  char c = (char) 10;
      -  boolean 제외
      -  byte short int long float double 이 방향대로면 자동형변환되어, 형변환연산자 생략가능하다.
         char int long float double 
      -  형변환 연산자가 생략 불가한 경우는 명시적 형변환 . 강제형변환 / 다운캐스팅이라고 한다.
    조건문 : if문과 swicth문

     

     


     

     

    • int kor = 100; 에서 kor = 39; 로 변경하면 계속 컴파일된다.
    • 하지만 동적으로 값을 생성하거나, 직접 입력받는다면 컴파일되지 않는다.
    • ScoreTest.java의 점수 변수들을 랜덤값으로 바꾸겠다.
    • 동적생성방법
    double d = Math.random();		// 0.0와 같거나 크고 1.0보다 작은 난수를 생성한다.
    double d1 = Math.random() * 100;	// 0.0와 같거나 크고 100.0보다 작은 난수를 생성한다.
    int d2 = (int)(Math.random() * 100);	// 0와 같거나 크고 100보다 작은 난수를 생성한다. 
    					// (99까지만 나옴)
    int d3 = (int)(Math.random() * 100) + 1;// 1와 같거나 크고 101보다 작은 난수를 생성한다. 
    					// (100까지만 나옴)
    int d3 = (int)(Math.random() * 범위) + 시작값;
    로또 번호를 만든다면? 	(int)(Math.random() * 45) + 1;

     

     


     

     

    자바의 반복문

    for while do-while
    for(int i = 1; i <= 10; i++) {
           내용
    }
    int i = 1;
    while(i <= 10) {
            System.out.println(i);       무한루프
    }


    while(i <= 10) {
             i++;
            System.out.println(i);  
    }


    int i = 키보드 입력;
    while(true) {          true 주면 시작은 한다.
            int i = 키보드 입력;
            if(i == 13) {} break;
    }
    int i = 11;

    do {
            System.out.println(i);  
            i++;
    } while (i<= 10)
    언제 시작하고, 언제 끝나고, 어떻게 변화하는지 지정한다. 언제 끝나는지만 지정한다.

    사용자가 키보드 입력값으로 "제목" 입력할 때까지 돌리거나 이럴 때 사용한다.

    if문 없으면 무한루프된다. (true)를 받으니까. 보통 무조건 시작하게 (true)를 넣고, 멈출 수 있는 수식 break를 넣는 형태이다.
    무조건 한 번은 수행한다.

     

     

     

     

    자바의 이동문

    break continue
     1. switch 블록 내부에서 사용: swicth 블록 내부 문장의 수행을 종료하고 블록 다음 문장으로 이동해라.

     2. for, do-while, while 반복문 블록 내부에서 사용 : 반복을 종료하고 블록의 다음 문장으로 이동해라.
    2. for, do-while, while 반복문 블록 내부에서 사용 : 반복을 종료하고 블록의 처음 문장으로 이동해라. 남은 반복은 계속 수행해라.
    if( ) break;
    if( ) continue;

    이런 식으로 블럭 안에 1문장만 있는 경우, { } 생략 가능하다.

     

     

     


     

     

    배열

    • 참조형 변수는 stack 저장 크기가 동적이다. heap 영역 동작 크기의 실제값을 저장하고 stack 에 주소값을 넣는다.
    • 배열 : 동일 타입의 데이터를 여러개 모은 것이다. 참조형 변수이다.
    • 자바스크립트의 배열은 갯수도, 타입도 유동적이었다.
    • 자바의 배열은 갯수도, 타입도 비유동적이다.

     

    int i; 변수 선언

    i = 100; 변수값 초기화 (변수값을 할당한다.)

    int i = 100; 변수의 선언과 초기화를 동시에 한다.

     

    배열 선언

    1. 동일 타입의 데이터를 여러개 모은다. 

    int[ ] ar

    int ar[ ]

     

    2. 배열 생성 (메모리에, 기본형은 이 단계 없다)

    ar = new int[5];      5개의 정수를 저장하는 배열이다.

    1000번지라는 주소값을 100번지에 할당해준다.

    1000이 실제값이 아닌, 주소정보이다. 참조형 변수이다.

    stack heap
    1번 진행 : 1000
        : ar이 100번지에 생성된다. 아직 주소값이 없고, 여기에 값이 올 것이라는 것만 알고 있다. (1번 과정 끝)
        : ar의 값이 미정이다 : null
    2번 진행
        : 1000:[0]0][0][0][0]
        : int 배열은 기본값이 0이다.

     

     

    3. 배열값 초기화 = 배열값 저장

    4. 출력 총합 평균 최대 최소 ... 

     

    배열은 int, double, boolean, char, String, 배열 모두 가능하다.

    int ar[ ] = new int[5];

     

    문자열배열 ["servlet", "spring", "java"]

    int 배열 초기화값 : 0

    string 배열 초기화값 : ""

    stach heap
    100번지의 ar는 1000번지를 참조한다. 1000번지
    ["servlet"]["spring"]["java"]

    사실 string도 참조변수라서 실제로는 아래와 같다.
    [300] [400] [500]

    300번지의 servlet
    400번지의 spring
    500번지의 java

     

     

     


     

     

    1차원 배열 2차원 배열

    1차원 배열

    int i[]

    {1, 2, 3}

     

     

    2차원 배열 

    • int i [] [];
    • i = new int[2][3]
    • {{0,0,0}, {0,0,0}}
    • i.length 하면 2가 나온다. 3개짜리 배열을 2개 가지고 있는 거라서.
    • i[0] 는 3이다.
    • i[1] 은 3이다.
    • i[2] 는 오류이다.

     

    • {{0,0}, {0,0,0}}
    • int i[][] = new int[2][];
    • i[0] = new int[2];
    • i[1] = new int[3];

     

    • 배열 두 개의 길이가 같다면 한번에 만들고, 아니라면 밑 코드처럼 new int[n]의 형태로 줘야 한다.

     

     


     

     

    커맨드 라인을 통해 입력받기 ... ?

    이건 main 메소드의 args를 사용하는 방법이다 !! 입력변수를 run configuration으로 받고, 실행하면 String 값으로 args 안에 들어가있다. 그 값을 사용하기 위해 for문을 사용하여 다른 배열에 담고 사용하는 것을 배운 것이다.

     

    명령행 매개변수, String[] main

    도스창 명령어 이클립스
    A.java
    javac A.java      자바가 실행된다.
    java A     ====>     A의 main 메소드가 실행된다.
    컴파일 자동이다.
    A 클래스 실행시 입력변수를 전달받고 싶다.
    A 클래스를 실행할 때 자바를 실행하는 그 라인에 변수를 전달하는데, 갯수는 공백으로 분류한다.
    java A 홍길동 사원 인재개발부   ===>   3개의 입력변수 전달
    java A 100                 ===>      1개 
    java A 홍길동 29       ===>      2개
    run as - java application
    run configuration - argument - program ar ... 이런 식으로 입력?
    전달받은 거 사용하는 법
    class A {
    public static void main(String[] args) {

          }
    }

    String[] args는 String만 조작하는 args라는 배열이라는 뜻이다. args는 입력변수를 저장하는 용도이다. 배열을 사용하는 이유는 입력변수가 몇 개 올지 모르기 때문이다. String으로 모두 받은 뒤, 필요하다면 형변환해준다.
    와!!! (String[] args) 가 이런 뜻이었구나 !!!
    이래서 main없으면 실행이 안 되는 거였구나 !!!
    !!! 그렇네!!!

    public void A(int a) { } 이거랑
    public static void main(String[] args) { } 이거랑
    똑같은 구조구나!!!!!!!!!!!!!!!!!!!!

    몰랐네!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    java A 홍길동 사원 인재개발부
    입력시 아래 문장이 자동으로 실행된다.
    args = new String[3];
    args[0] = "홍길동";
    args[1] = "사원";
    args[2] = "인재개발부";

    java A   ===>  args.length   = 0  ==>  입력변수 없다는 뜻이다.
    args라는 이름은 변경 가능하다. 굳이 할 필요는 없지만 ... 

     

     

     

    run configuration 사용해서 입력변수 입력하기 - args[]에 값을 담기 위함이다.

    공백으로 구분한 세 가지 문자열을 전달한다.
    이렇게 실행될 것

    실행 결과 - args[]에 담긴 값을 for문으로 꺼내는 것이다.

    public static void main(String[] args) {
        System.out.println("입력한 변수의 갯수 : " + args.length);
        System.out.println("입력한 내용은 다음과 같습니다.");
    
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
    
    --------------------------------------------------------------
    
    입력한 변수의 갯수 : 3
    입력한 내용은 다음과 같습니다.
    홍길동
    사원
    인재개발부

     

     

     

    -

     

     

    공백이 있는 값을 하나로 묶고 싶은 경우 

    • ㄱ ㄴ ㄷ 라고 하면, 공백이 값을 구분하는 역할이기에 {ㄱ, ㄴ, ㄷ}이 된다.
    • "ㄱ ㄴ" ㄷ 라고 하면, {ㄱ ㄴ, ㄷ}가 된다.
    • " "" 안에 묶자!!!"

     

     

     

     

    코드 확인

    • main메소드에는 String[] args라는 배열이 있다.
    • String 타입이라서 정수 입력해도 String으로 반환된다.
    • args는 props처럼 받은 값을 저장하기만 할 뿐, 값을 변경할 수 없다. 길이 변경도 불가하다.
    • args의 길이를 1칸 늘리기 위해 userarray[]로 복사했다.
    • run configuration을 통해 입력변수를 준다. 
    • userarray[]의 마지막에 값을 추가하고 싶다면, index 부분을 args.length로 주면 된다. 
    String userarray[] = new String[args.length + 1];
    
    for(int i = 0; i < args.length; i++) {
        userarray[i] = args[i];		// 입력변수들 복사
        System.out.println("userarray[" + i + "]: " + userarray[i]);
    }
    
    userarray[args.length] = "내가 추가한 문자열";
    for(int i = 0; i < userarray.length; i++) {
    	System.out.println("userarray[" + i + "]: " + userarray[i]);
    }

     

     

     

     

    args[ ]의 특정 키워드를 포함하는 값을 꺼내는 법 (StudentTest)

    args[ ] = {"홍", "이", "김", "박", "최"}
    names[ ] = {"홍 응시자", "이 응시자", "김 응시자", "박 응시자", "최 응시자"}
    args[i].equals("홍") "홍" 문자열과 같은 걸 찾는다.
    names[i].equals("홍 응시자 ") "홍 응시자" 문자열과 같은 걸 찾는다.
    names[i].substring(0, 1).equals("홍") "홍 응시자" 의 0번째 문자열을 찾는다.
    names[i].trim().equals("홍 응시자") 만약 " 홍 응시자   " 인 경우, 양쪽의 빈칸을 모두 없애고 찾는다.

     

     

     


     

     

    ==와 equals()

     

    • 참조형 변수 : 배열, String
    • int a[] = new int[5]라고 하면 heap 영역에 새로운 공간을 만드는 것이다.

     

    String s1 = "java";

    String s2 = "java";

    String s3 = new String("java");

    String s4 = new String("java");

     

    s2 = "jsp"          로 변경!

     

    아 그런데. 여기서 new로 생성한 애들도 다시 사용할 수 있다.

    String s5 = s3; 으로 한다면 s5와 s3은 ==도, .equals( )도 true가 나온다.

     

    stack heap
    s4 : 400
    s3 : 300
    s2 : 100
    s1 : 100
    100 : "java"

    300 : "java"

    400 : "java"
    stack은 먼저 생긴 게 밑으로 들어가니까 !!  
    s2 : 500                    500 : "jsp"

     

    == equals()
    문자열 저장주소의 동등성을 비교한다.
    String은 저장주소를 참조하기 때문 !!!
    문자열 내용의 동등성을 비교한다.
    s1 == s2                  true
    s3 == s4                  false
    s1.equals(s2)                 true
    s3.equals(s4)                  false
    엥 그런데 s2를 "jsp"로 변경한다면?
    그러면 s1도 "jsp"로 바뀐 거라는 건데 ... 

    자바에서 문자열과 명령행 매개변수의 특성은 한번 메모리에 생성되는 순간, 길이도 내용도 변경할 수 없다. 불변이다.
     
    s1 == s2                  false s1.equals(s2)                 false

     

     

     

    String의 메소드

    이름 기능 반환 결과
    equals() 문자열 내용을 비교한다. t / f
    length() 문자열 갯수를 나타낸다.
    length는 배열 길이임!
    int
    charAt(index) 인덱스 번호에 해당하는 char를 반환한다. char
    subString(index, index) String s1 = "abcdefg";
    s1.subString(1, 3)         1번 인덱스 ~ 3번 인덱스 전까지의 문자열 반환
    b c 반환한다.
    String

     

     


     

     

    오늘 수업 ... 너무 재밌었다 ... 나는 참조형 변수를 좋아하는 건가?

     

     

     

     

     

     

Designed by Tistory.