KEEP GOING

[프로그래머스] 자바 입문 PART1~5 정리 본문

language/java

[프로그래머스] 자바 입문 PART1~5 정리

jmHan 2022. 5. 3. 18:30
반응형

https://programmers.co.kr/learn/courses/5/

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr

 

[파트1. 자바 시작하기]

  • cmd 컴파일 명령어 javac
  • cmd 실행 명령어 java

이클립스 워크스페이스 경로 C:\Users\dkwlw\Desktop\JAVA

프로젝트 생성 file>new>Java Project

 

  • 폰트 크기 조정 Windows > Preference > fonts 검색 
  • Ctrl + S : 저장시 바로 컴파일 처리됨
  • 워크스페이스 경로인 JAVA 디렉토리로 들어가면 bin 폴더에 class 파일, src 폴더에 java 파일 생성
  • 파일 실행 경로 *.java > Run AS > Java Application

 

[파트2. 변수와 계산]

[상수]

  • 변수 앞에 final 이라는 키워드를 붙이면 상수이다.
  • 상수란 변하지 않는 수로, 선언과 동시에 바로 초기화를 해야 한다.       
  •  상수는 대문자로 시작한다는 명명 규칙이 존재함
  • 여러 단어로 이루어진 경우 '_'로 구분한다.

ex)  final int  PI = 3.1415; // PI - 상수, 3.1415 - 리터럴(값)

 

[비교 연산자]

    i += 10;

    System.out.println(i);  //10  
    System.out.println(i -=5);  //5
    System.out.println(i);  //5

 

[연산자 우선순위 - 증감 연산자]

  • 증감 연산자는 전위 연산자인지 후위 연산자 인지에 따라서 우선 순위가 바꾼다.
  • 전위 증감 연산자는 실행문에서 값이 먼저 증가/감소해서 적용된다 ex) ++a
  • 후위 증감 연산자는 실행문에서 값이 후에 증가/감소해서 적용된다. ex) a++
int a = 5; 
System.out.println(++a - 5);  //1
System.out.println(a); // 6

int a = 5; 
System.out.println(a++ - 5); //0
System.out.println(a);  //6

 

[파트3. 제어문]

[if - else if - else문]

    if(조건식1){
        실행문;  //조건식1이 true일때 실행
    }else if(조건식2){
        실행문;  //조건식1이 false이고 조건식2가 true일때 실행
    }else{
        실행문;  //조건식1과 2가 false일때 실행
    }

 

[삼항 연산자]

  • 조건식 ? 피연산자1 : 피연산자2
  • 조건식의 연산결과가 true 이면, 결과는 피연산자 1이고, false 이면 결과는 피연산자2
 int b = (5>4) ? 50 : 40;  //50

 

[switch-case]

  • switch문은 어떤 변수의 값에 따라서 문장을 실행할 수 있도록 하는 제어문
  • switch문에서 사용하는 키워드는 switch, case, default, break 
  • switch 다음 괄호 안에 정수 타입의 변수만 올 수 있었지만, JDK7부터는 문자열 타입의 변수도 올 수 있음
    String grade = "A";

    switch(grade){
        case "A": 
            System.out.println("1등급");
        case "B":
            System.out.println("2등급");
        case "C" :
            System.out.println("3등급");
        default :
            System.out.println("fail");
    }

 

+ 예제) 다음 코드의 출력값은?

public class SwitchExam {
	public static void main(String[] args) {
	    int a = 100;
	    switch(a/10) {
	        case 10:
	    	    System.out.print('A');
	        case 5:
	    	    System.out.print('B');
	        default:
	    	    System.out.print('C');
	    }
	}		
}

답: ABC

 

*switch문의 제약 조건 

switch문에서 조건식에 a/10.0이 올 수 있을까? 답은 올 수 없다.

a/10.0 = 100/10.0으로 자동형 변환되어 값은 10.0이 되는데, switch 문의 조건식의 값은 반드시 정수 타입만 가능하다.

그리고 이 조건식의 값이 case문으로 이동하기 때문에 case 문 값 역시 정수여야 한다.

즉, 실수나 변수는 조건식 그리고 case문의 값이 될 수 없다. 

 

1. switch문의 조건식의 값은 반드시 정수 또는 문자열이어야 한다. (Java 1.7부터 문자열 허용)

2. case문의 값은 정수 혹은 상수만 가능하며 중복되어서는 안된다. (실수 x, 변수 x)

    int result, num;
    final int ONE = 1;
    switch(result){
        case '1': //문자 가능(정수 49와 같음) 
            ...
        case "cash": //문자열 가능 
            ...
        case ONE : //정수인 상수 가능 
            ...
        case num: //변수 불가능 
            ...
        case 1.7: //실수 불가능
            ...
    }

[파트4. 배열]

  • 배열의 길이 arr.length  ※ 문자열의 길이는 str.length()

[2차원 배열]

  int[][] array = new int[3][4];
  • 정수 4개씩 담을 수 있는 배열 3개 생성
  • array[1]은 또 다른 1차원 배열을 가리키는 참조형 변수이므로 값을 담을 수는 없다 array[1] = 10; (X) 

 

[가변 크기의 2차원 배열 생성하기]

    int[][] array = new int[3][];
    //array는 3개짜리 배열을 참조함. 3개짜리 배열은 아직 참조하는 배열이 없다.

    array[0] = new int[1]; //정수를 하나 담을 수 있는 배열을 생성하여 array의 0 번째 인덱스가 참조.  
    array[1] = new int[2]; //정수를 두개 담을 수 있는 배열을 생성하여 array의 1 번째 인덱스가 참조.  
    array[2] = new int[3]; //정수를 세개 담을 수 있는 배열을 생성하여 array의 2 번째 인덱스가 참조.

 

[배열 선언 및 초기화]

// 크기할당 및 초기화 없이 배열만 선언
		int[] arr1; // -- (1)
		int arr2[];
		
		// 선언과 동시에 배열 크기 저장
		int[] arr3 = new int[5];
		String[] arr4= new String[3];
		
		// 기존 배열 초기화하기
		arr1 = new int[5]; // (1) 참고

		// 선언과 동시에 배열 크기 지정 및 값 초기화
		int[] arr5 = {1,2,3,4};
		int[] arr6 = new int[] {1,3,3,3};
		
		String[] weeks = {"월","화","수","목","금","토","일"};
		
		// 2차원 배열 생성
		int[][] arr7 = new int[4][3];
		int[][] arr8 = {{1,5,3}, {7,4,5}, {4,1,9}, {9,4,4}};

 

- for each 구문 (향상된 for문)

for (int val:arr){   

    System.out.println(val);

}

 

+)

String names = {"suzy", "nabi", "jeongsoo"};

for (String str:names){   

    System.out.println(str);

}

//suzy

//nabi

//jeongsoo

 

 

 

[파트5. 클래스와 객체]

String 클래스를 이용하여 문자열을 생성할 때

String str1 = "hello";

String str2 = "hello";

=> hello는 상수값으로 상수가 저장되는 영역에 저장된다. 따라서 str1, str2 두 변수는 같은 인스턴스를 참조한다. 

 

String str1 = new String("hello");

String str2 = new String("hello");

=> new 연산자를 이용할 경우 무조건 인스턴스가 새로 생성된다. 따라서 두 변수는 다른 인스턴스를 참조한다.

 

  • String은 불변 클래스이다. 불변이란 String이 인스턴스가 될때 가지고 있던 값을 나중에 수정할 수 없다.
  • String은 문자열과 관련된 다양한 메소드를 가지고 있다. 메소드를 호출한다 하더라도 String은 내부의 값이 변하지 않는다.
  • String이 가지고 있는 메소드중 String을 반환하는 메소드는 모두 새로운 String을 생성해서 반환한다.

 

[String이 불변 클래스임을 보여주는 예제]

public class StringExaml {
	public static void main(String[] args) {
		String s = "hello";
	
		System.out.println(s);
		System.out.println(s.substring(3));
		System.out.println(s);
	}
}

결과값

 

[주소값 비교(==)와 값 비교(equals)]

public class StringExaml {
    public static void main(String[] args) {
	    String s1 = new String("hello");
	    String s2 = new String("hello");
	
	    if (s1.equals(s2)) {
	        System.out.println("두 변수는 같은 문자열을 포함하고 있음");
	    }
	    else{
	        System.out.println("두 변수는 다른 문자열을 포함하고 있음");
	    }
	    if (s1 != s2) {
	        System.out.println("두 변수의 참조값은 다름");
	    }
	    else{
	        System.out.println("두 변수의 참조값은 같음");
	    }
    }
}

결과값

 

[String 클래스의 메소드]

String str = "hello";

System.out.println(str.charAt(0));
System.out.println(str.concat("world"));
System.out.println(str.length());
System.out.println(str.substring(2));
System.out.println(str.substring(1,3));

결과값

 

[변수의 scope와 static]

  • 모든 클래스는 인스턴스화하지 않은 채로 실행할 수 없다
  • static 키워드를 붙이면 클래스가 인스턴스화하지 않아도 static 필드, static 메소드 실행 가능
  • 스코프 : 프로그램 상에서 사용되는 변수들의 사용 가능한 범위

 

[메인 메소드에서 변수 사용하기]

    public class VariableScopeExam {
        int globalScope = 10; //인스턴스 변수

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
    }
  • main 메소드는 static한 메소드이기 때문에 globalScope라는 Non static한 필드를 사용 할 수 없다.
  • 매개변수로 선언된 int value 는 메서드 선언부에 존재하므로 해당 메소드 블럭 내에서만 사용할 수 있다.
  • 메소드 블럭내에서 선언된 localScope 변수의 scopeTest 메소드 블럭 내에서만 사용 가능하다.

 

[인스턴스 변수와 클래스 변수 비교]

  • golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기 때문에 인스턴스 변수라고 한다.
  • staticVal같은 static한 필드를 클래스 변수라고 한다.
    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  //20 이 출력된다. 
    System.out.println(v2.golbalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.staticVal);  //20 이 출력된다. 
    System.out.println(v2.staticVal);  //20 이 출력된다.
    System.out.println(VariableScopeExam.staticVal);  //20 이 출력된다.
  • static한 변수는 공유된다
  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되어도 static한 변수는 하나다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다.

 

 

 

 

 

반응형
Comments