본문 바로가기
Java/생활코딩

생활코딩 - 자바입문 (시즌1)

by 자연송어 2021. 5. 2.

생활코딩

자바 학습 방법
1. 숲을 보기 위해 빠르게 생활코딩으로 
2. 나무를 보기 위해 실습을 천천히 따라해보기

Java - 이클립스의 기능과 예제의 사용방법
- 프로젝트 생성시
.classpath , .project 파일은 이클립스의 프로젝트에 대한
여러가지 정보들을 담고 있는 파일이기 때문에 지워도 괜찮음. 

- bin과 src 폴더 설명
src = sorce의 약자 (.java 파일) = 우리가 작성한 코드 저장(소스)
bin = binary의 약자 (.class 파일) = 이클립스를 통해 컴파일된 파일 저장(애플리케이션 실행)

<패키지 생성 시> 
- org.opentutorials.javatutorials.eclipse 패키지 생성 시
- src 폴더 안에 org폴더 안에 opentutorials폴더 안에 javatutorials폴더 안에 eclipse폴더가 생성
- 패키지 이름 점을 통해 구분되서 자동으로 폴더 생성됨.

Java - 문자열
자바는 문자와 문자열을 구분한다.
문자는 한글자를 의미, 문자열은 여러개의 문자를 합한 것을 의미
- 문자열은 "(큰따옴표)"로 감싸야 한다.
- 문자열은 작은 '(따옴표)로 감싸면 에러가 발생한다.
- 하나의 문자를 큰 따옴표로 감싼다고 에러가 발생하지는 않는다. 한글자도 문자열이 될 수있다.

 

- 이스케이프 기법 (문자열 안에 큰따옴표를 넣고 싶을 때)

Ststem.out.println("egoing said \"Welcome programming world\"");
//결과값은 (egoing said "Welcome programming world")
//문자열 안에 큰따옴표를 넣고 싶을 때 역슬래쉬(\) 사용
//이러한 기법을 이스케이프라고 한다. 큰따옴표가 가진 문법적인 역할을 도망쳐서 문자로 인식하도록 한다는 의미

- \n : 줄바꿈

 

변수 (3/4) : 문자열

String first;
first ="coding";
// 번수 선언
// String first = "coding"; 이것도 가능

변수 (3/4) : 변수의 효용

변수는 코드의 재활용성을 높여준다. 

- 중복의 제거

- 가독성 향상

- 유지보수의 편리함

 

데이터타입(1/2) : 데이터의 크기

 

데이터타입(2/2) : 데이터타입 비교

보통 숫자, 정수를 저장할 때는 int를 사용하면 됨.

- int형 처리할 때 cpu 처리속도가 빠르고

- 충분히 큰 수를 표현할 수 있는 데이터 타입 

 

- 데이터 타입에 따라 메모리를 사용하는 크기가 달라짐.

- 작은 데이터를 사용할때는 byte를 사용해야 메모리를 절약할 수 있음.

- 큰 데이터를 사용할 때는 long을 사용해야 메모리를 수용할 수 있음.

 

long a = 2147483647;
long b = 1; 

위의 변수a와 변수b는 둘다 똑같이 8byte의 메모리를 사용하게 된다. 데이터 타입이 같기 때문

 

int a = 214783647;
long b = 214783647;

반대로 위의 변수a와 변수b는 똑같은 수를 저장하고 있지만, 변수b가 2배의 메모리를 사용한다. 데이터 타입이 다르기 떄문

 

상수형 데이터 타입 

상수 = 변하지 않는 값

float a = 2.2; //에러 발생
float a = 2.2F; //뒤에 플로타입이라는 뜻인 F를 넣어야 함.

long a = 214783648; // 에러발생, int가 저장할 수 있는 수보다 1많은 수. int로 저장되어있어서 long으로 변환필요
long a = 214783648L; //뒤에 롱타입이라는 뜻인 L을 넣어야 함.

byte b = 100;
short c = 200;
//모든 정수는 기본적으로 int로 저장되어 있지만 byte와 short는 허용범위까지 저장가능

형변환

- int타입 200과 float타입의 200은 메모리상으로 다른 값을 가진다.

 

- 3.0F는 float타입인데 double에 대입해도 자동 형변환을 통해 오류가 발생하지 않는다.

 

- 만약 float을 1-10까지 저장이 가능하고, double이 1-100까지 저장이 가능하다고 한다면

- float은 double에 저장 가능하지만  double은 수용범위에서 벗어났기 때문에 float에 저장이 불가능하게 된다는 것. 

 

- 정수는 실수로 형변환 할 수 없다. 

 

 

명시적 형변환

- 100.0은 실수 타입. 실수타입은 기본적으로 double에 저장됨.

- 100.0F는 float타입

- 숫자 앞에 괄호를 하고 데이터타입을 작성하면 명시적 형변환 가능

 

int a= 10;
int b= 3;
//정수

float c = 10.0F;
float d = 3.0F;
/실수

Systoem.out.println(a/b); //결과값은 3
Systoem.out.println(c/d); //결과값은 3.33333
Systoem.out.println(a/d); //결과값은 3.33333

- 정수와 실수가 같이 연산을 할 떄 내부적으로 실수로 형변환되서 계산됨. 

 

연산자(3/4) - 단항연산자

package org.opentutorials.javatutorials.operator;
 
public class PrePostDemo {
    public static void main(String[] args) {
        int i = 3;
        i++;
        System.out.println(i); // 4 출력
        ++i;
        System.out.println(i); // 5 출력
        System.out.println(++i); // 6 출력
        System.out.println(i++); // 6 출력
        System.out.println(i); // 7 출력

- ++i는 i의 값에 1이 더해진 값을 출력하는 것이고,

- i++는 이것이 속해있는 println에 일단 현재 i의 값을 출력하고,

println의 실행이 끝난 후에 i의 값이 증가하는 특성이 있다.

 

연산자 (4/4) - 우선순위

 

연산자들 간의 우선순위를 정리한 표

 

비교와 Boolean

 

불린(Boolean)은 참과 거짓을 의미하는 데이터 타입으로 bool이라고도 부른다. 불린은 정수나 문자와 같이 하나의 데이터 타입인데, 참을 의미하는 true와 거짓을 의미하는 false 두 가지의 값을 가지고 있다. 

        System.out.println(1==2);           //false
        System.out.println(1==1);           //true
        System.out.println("one"=="two");   //false
        System.out.println("one"=="one");   //true

비교 연산자 (관계 연산자) : ==

대입 연산자 : =
부정 연산자 : !=

.equals

.equals는 문자열을 비교할 때 사용하는 메소드다. 우리는 아직 메소드를 배우지 않았기 때문에 지금은 그냥 이것을 연산자로 이해해도 무방하다. 아래는 문자와 문자를 비교하는 방법이다.

 

        String a = "Hello world";
        String b = new String("Hello world");
        System.out.println(a == b); // false 잘못된 연산자
        System.out.println(a.equals(b)); //true

조건문 (1/4) : if

if

조건문은 if로 시작한다. 아래 그림을 보자. if 뒤의 괄호를 if절이라고 부르고, 중괄호가 감싸고 있는 구간을 then 절이라고 부르겠다. 조건문에서는 if 절의 값이 true일 때 then 절이 실행된다. if 절이 false이면 then 절은 실행되지 않는다.

 if (true) {
            System.out.println(1);
            System.out.println(2);
            System.out.println(3);
            System.out.println(4);
        }
        System.out.println(5);
        
        //결과값은 1,2,3,4
        //false인 경우 5 출력

if (true) {
            System.out.println(1);
        } else {
            System.out.println(2);
            
            //true인 경우 1 출력
            //false인 경우 2 출력

        if (false) {
            System.out.println(1);
        } else if (true) {
            System.out.println(2);
        } else if (true) {
            System.out.println(3);
        } else {
            System.out.println(4);

- else if 절에서 처음 true가 발생한 곳에서 값을 출력하고 다음으로 코드로 넘어감.

- else if가 모두 false 이면 마지막 else가 출력됨.

 

public static void main(String[] args){
	String id = args[0];
    if(id.equals("egoing")){
    	System.out.println("right");
        } else{
        	System.out.println("wrong");
            }
            }
            }

이클립스에서 run configurations - new launch configuration - (name: LoginDemo input - egong )입력

- Arguments(입력값): egoing 입력 - run - 콘솔화면에 right 출력

 

 public static void main(String[] args) {
        String id = args[0];
        String password = args[1];
        if (id.equals("egoing")) {
            if (password.equals("111111")) {
                System.out.println("right");
            } else {
                System.out.println("wrong");
            }
 
        } else {
            System.out.println("wrong");

- id와 password가 있을 때 둘다 true가 나와야 right가 출력되는 if문

- if문 안에 다시 if문이 등장했다. 즉 사용자가 입력한 값과 아이디의 값이 일치하는지를 확인한 후에 일치한다면 비밀번호가 일치하는지 확인한 것이다. 이렇게 조건문은 조건문 안에 중첩적으로 사용될 수 있다.

 

조건문 5 : switch

   System.out.println("switch(1)");
        switch(1){
        case 1:
            System.out.println("one");
        case 2:
            System.out.println("two");
        case 3:
            System.out.println("three");
        }
        
        //결과값은 
        one
        two 
        three

 

switch 뒤의 괄호에 숫자로 1이 주어지면 case 1에 해당하는 로직 이후의 모든 case들이 실행된다.

마찬가지로 숫자로 2가 주어지면 case 2에 해당하는 로직 이후의 모든 case 실행된다.

 

System.out.println("switch(1)");
        switch(1){
        case 1:
            System.out.println("one");
            break;
        case 2:
            System.out.println("two");
            break;
        case 3:
            System.out.println("three");
            break;

break를 만나면 switch 문의 실행이 즉시 중지된다

 

 

int val = 1;
if(val==1) {
	System.out.println("one");
    } else if (val==2){
    System.out.println("two");
    } else if (val==3){
    System.out.println("three");
    }
    }

switch문을 if문으로 변경한 것↑

 

 System.out.println("switch(1)");
        switch(1){
        case 1:
            System.out.println("one");
            break;
        case 2:
            System.out.println("two");
            break;
        case 3:
            System.out.println("three");
            break;
        default:
            System.out.println("default");
            break;
        }

1,2,3이 아닌 다른 수를 입력할 시 defalut값 출력

 

switch 문을 사용할 때 한가지 주의 할 것은 switch의 조건으로는 몇가지 제한된 데이터 타입만을 사용할 수 있다. byte, short, char, int, enum, String, Character, Byte, Short, Integer

 

논리연산자 (1/3) : and

&&는 좌항과 우항의 값이 모두 참(true)일 때 참이 된다. And라고 읽는다

  String id = args[0];
        String password = args[1];
        if (id.equals("egoing") && password.equals("111111")) {
            System.out.println("right");
        } else {
            System.out.println("wrong");
        }

위에서 if를 두번 사용해서 id와 password를 입력했지만

위처럼 논리연산자를 사용하여 코드를 개선해서 더 짧고 간결하게 코드 사용 가능하다.

 

논리연산자 (2/3) : or

||(or)는 좌우항 중에 하나라도 true라면 전체가 true가 되는 논리 연산자다.

 String id = args[0];
        String password = args[1];
        if ((id.equals("egoing") || id.equals("k8805") || id.equals("sorialgi"))
                && password.equals("111111")) {
            System.out.println("right");
        } else {
            System.out.println("wrong");
        }

- id 중 하나라도 true이고, 패스워드도 함꼐 true면 right 출력

논리연산자 (3/3) : not

!는 부정의 의미로 not이라고 읽는다. Boolean의 값을 역전시키는 역할을 한다. true에 !를 붙으면 false가 되고 false에 !을 붙이면 true가 된다. 

 

반복문 (1/5) : while

while(조건){
    반복 실행 영역
}
int i = 0;
// i의 값이 10보다 작다면 true, 크다면 false가 된다. 현재 i의 값은 0이기 때문에 이 반복문은 실행된다. 
while(i<10){         
    System.out.println("Coding Everybody"+i);
    // i의 값에 1을 더한다. 반복문의 중괄호의 마지막 라인에 도달하면 반복문은 반복문을 재호출한다. 이때 i<10의 값을 검사하게 된다.
    i++;
}
while(false){
    System.out.println("Coding Everybody");
}
//false인 경우 아예 컴파일조차 되지 않는다.
//반복 조건이 false이기 때문에 반복문이 한 번도 실행되지 않을 것이기 때문에 컴파일러가 오류를 발생시키는 것

반복문 (2/5) : for

- while문을 보면 반복의 횟수를 지정하기 위해서 while문 외부에 변수 i의 값을 초기화하고, while문 안에서 i의 값을 증가시키고 있다. 이것은 코드를 산만하게 할 수 있다.

- 반복문에서 자주 사용하는 이러한 패턴을 문법적인 형태로 만든 것이 for문이다. for문은 특정한 횟수만큼 반복 실행을 하는 경우에 자주 사용된다. 하지만 for문이나 while문이나 서로 대체 가능하다. 취향에 따라서 선택하면 된다.

for(초기화; 종료조건; 반복실행){
    반복적으로 실행될 구문
}
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println("Coding Everybody " + i);
        }

 

반복문 (3/5) : 반복문이 없다면

//coding everybody'를 1천 번 출력해야 한다면
int i = 0;
while(i<10){
    System.out.println("coding everybody");
    i++;
    
// coding everybody 뒤에 붙는 숫자를 2의 배수하고 싶다면
int i = 0;
while(i<10){
    System.out.println("coding everybody"+(i+1)*2);
    i++;

- 가변적인 것과 고정적인 부분을 잘 구분하는 것이 프로그램 설계에서 가장 기본적이고 중요한 원칙

 

반복문 (4/5) : break, continue

break

반복작업을 중간에 중단시키고 싶다면 break를 사용

for (int i = 0; i < 10; i++) {
            if (i == 5)
                break;
            System.out.println("Coding Everybody " + i);
//결과값은
coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4

2행의 if(i == 5) 에 의해서 i의 값이 5일 때 break 문이 실행되면서 반복문이 완전히 종료된 것

 

continue

그럼 실행을 즉시 중단하면서 반복은 지속해가게 하려면 continue 사용(건너뛰기 후 반복)

 for (int i = 0; i < 10; i++) {
            if (i == 5)
                continue;
            System.out.println("Coding Everybody " + i);
//결과값은
Coding Everybody 0
Coding Everybody 1
Coding Everybody 2
Coding Everybody 3 //continue로 인해 5가 빠짐.
Coding Everybody 4
Coding Everybody 6
Coding Everybody 7
Coding Everybody 8
Coding Everybody 9

반복문 (5/5) : 반복문의 중첩

for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                System.out.println(i + "" + j);

00부터 99까지 화면에 출력하는 코드 

 

- 이고잉님이 자바입문 수업에 대해 시즌1과 2를 나누시며 난이도에 대해서 말씀해주심. 

- 현재까지는 절차지향을 배웠고 시즌2부터 객체지향이 드디어 시작된다고 함. 

- 시즌2로 넘어가면 난이도가 급격하게 상승한다는 것을 보고 불안한 감정이 들지만 열심히 따라가보자.

 

배열(2/6) : 정의

 

배열은 연관된 데이터를 모아서 관리하기 위해서 사용하는 데이터 타입이다. 변수가 하나의 데이터를 저장하기 위한 것이라면 배열은 여러 개의 데이터를 저장하기 위한 것이라고 할 수 있다

String[] classGroup = { "최진혁", "최유빈", "한이람", "이고잉" };

String[] classGroup에서 classGroup은 배열이 담길 변수의 이름이다. String[]은 classGroup에 담을 배열에 담길 데이터의 타입이 문자열의 배열이라는 의미다. 배열을 선언할 때는 데이터 타입 뒤에 []를 붙여야 한다. []가 없다면 classGroup는 배열이 아니라 문자열 데이터 타입을 갖는 변수가 된다. 배열에 소속될 데이터들은 중괄호 안에 위치한다. 그리고 각각의 데이터들은 쉼표로 구분된다.

 

 String[] classGroup = { "최진혁", "최유빈", "한이람", "이고잉" };
        System.out.println(classGroup[0]);
        System.out.println(classGroup[1]);
        System.out.println(classGroup[2]);
        System.out.println(classGroup[3]);
        
//결과값은 
최진혁
최유빈
한이람
이고잉
String[] classGroup = new String[4];
        classGroup[0] = "최진혁";
        System.out.println(classGroup.length);
        classGroup[1] = "최유빈";
        System.out.println(classGroup.length);
        classGroup[2] = "한이람";
        System.out.println(classGroup.length);
        classGroup[3] = "이고잉";
        System.out.println(classGroup.length);
        
//결과값은
4
4
4
4

배열 (4/6) : 반복문과 배열의 조화

 

1반 학생들이 상담을 받는다고 했을 때 이 사건에는 다음과 같은 절차가 함축되어 있다고 할 수 있다.

  1. 1반 학생들을 번호순으로 정렬해서 줄을 세운다.
  2. 상담받은 학생의 숫자를 기록한다.
  3. 대기중인 학생과 상담을 한다.
  4. 상담받은 학생의 수를 1 증가시킨다.
  5. 총원보다 상담받은 학생의 수가 작다면 3번 절차로 돌아간다.총원과 상담받은 학생의 수가 같다면 상담을 종료하고 업무를 계속한다.

위의 과정을 프로그래밍 언어로 그대로 옮겨보자. 

String[] members = { "최진혁", "최유빈", "한이람" };
        for (int i = 0; i < members.length; i++) {
            String member = members[i];
            System.out.println(member + "이 상담을 받았습니다");

배열 (5/6) : for-each

배열의 내용을 탐색할 때 for 문을 좀 더 간편하게 사용할 수 있는 방법이 있다.

 String[] members = { "최진혁", "최유빈", "한이람" };
        for (String e : members) {
            System.out.println(e + "이 상담을 받았습니다");

위의 예제는 이전 예제와 정확하게 동일하게 동작한다. 하지만 문법적으로는 간결해졌다.

for(String e : members)

위의 구문은 배열 members의 값을 변수 e에 담아서 중괄호 구간 안으로 전달해준다. 반복문의 종료조건이나 종료조건을 위해서 기준값을 증가시키는 등의 반복적인 작업을 내부적으로 감춘 것이라고 할 수 있다. 자바 5.0부터 도입된 기능이다.

 

배열 (6/6) : 배열의 오류와 한계

 

배열을 사용할 때 흔히 발생하는 오류

String[] members = new String[3];
members[0] = "최진혁";
members[1] = "최유빈";
members[2] = "한이람";
members[3] = "이고잉";

- 배열을 선언 할 때 이 배열의 크기를 3개의 문자열을 수용할 수 있는 크기로 지정했는데 더 많은 데이터를 추가하려고 하기 때문에 발생한 에러다. 예시로 들자면 50명을 수용 할 수 있는 교실에 51명을 억지로 집어넣으려고 하면서 발생한 오류

 -member 인덱스는 4개, new String = 3개

 

- 자바에는 컬렉션 Collection이라는 기능이 있다. Container라고도 부르는 이 기능을 이용하면

JavaScript의 배열과 같이 유연하게 배열을 사용할 수 있다. 

메소드 (2/6) : 정의와 호출

- numbering()을 정의하고 밑에서 다시 호출하는 모습.

 

메소드 (4/6) : 입력값

- 여기서 limit이라는 변수는 메소드 numbering의 정의 부에 있는 로직들에게 5라는 값을 전달하고 있다. 호출에서 입력한 값을 로직으로 매개 한다는 의미에서 이러한 변수를 매개변수라고 부른다. 영어로는 parameter다. 그리고 메소드를 호출할 때 전달된 값인 5를 '인자' 영어로는 argument라고 한다. 관습적으로는 매개변수와 인자를 구분하지 않고 부르는 경우도 많다.

복수의 인자

메소드 (5/6) : 출력값 1

public static String numbering(int init, int limit) {
        int i = init;
        // 만들어지는 숫자들을 output이라는 변수에 담기 위해서 변수에 빈 값을 주었다.
        String output = "";
        while (i < limit) {
            // 숫자를 화면에 출력하는 대신 변수 output에 담았다.
            output += i;
            i++;
        }
        // 중요!!! output에 담겨 있는 문자열을 메소드 외부로 반환하려면 아래와 같이 return 키워드 뒤에 반환하려는 값을
        // 배치하면 된다.
        return output;
    }
 
    public static void main(String[] args) {
        // 메소드 numbering이 리턴한 값이 변수 result에 담긴다.
        String result = numbering(1, 5);
        // 변수 result의 값을 화면에 출력한다.
        System.out.println(result);
    }

 

- 메소드 내에서 사용한 return은 return 뒤에 따라오는 값을 메소드의 결과로 반환한다. 동시에 메소드를 종료시킨다. 한가지 잊지 말아야 할 점은 return을 통해서 반환할 값의 데이터 형식을 메소드의 이름 옆에 명시해주어야 한다는 것이다.

-  메소드가 리턴 할 값을 명시함으로서 numbering이라는 메소드는 반드시 문자열의 값을 리턴한다는 것을 보장할 수 있는 장점이 있다. 

- 만약 반환 값이 없다면 아래와 같이 void를 적어준다.

 public static void numbering(int init, int limit) {

- void = (커다란) 빈 공간, 공동; 공허감

            …이 하나도[전혀] 없는

 

메소드 (6/6) : 출력값 2

- 만약 이 메소드가 출력한 값을 화면에 출력하는 것이 아니라 파일에 기록하고 싶다면 어떻게 해야 할까?

메소드를 만들고 용도에 따라서 코드를 재작성하는 것도 좋은 방법이다.

하지만 더 좋은 방법은 숫자를 출력하고, 숫자를 파일에 기록하고, 숫자로 이메일을 보내는 작업으로부터 숫자를 계산하는 로직을 분리하는 것이다.

- numbering은 자신이 어떻게 사용될지 모른다. 누구든지 numbering이라는 메소드를 호출할 때 초기값과 마지막 값을 입력하면 numbering은 숫자를 문자열의 형태로 반환하면 되는 것이다.

-numbering 메소드를 언제든지 사용가능한 부품으로 활용하기 위해 출력값(println)을 메인메소드에 빼놓은 것.

 

return의 특성

public class ReturnDemo {
    public static int one() {
        return 1;
        return 2;
        return 3;
    }
 
    public static void main(String[] args) {
        System.out.println(one());
        
//위의 코드는 컴파일조차 되지 않는다. 
왜냐하면, return 은 메소드를 종료시키는 역할을 하므로 
return이 처음 등장한 이후의 구문은 실행되지 않기 때문이다.
public class ReturnDemo2 {
    public static String num(int i) {
        if(i==0){
            return "zero";
        } else if(i==1){
            return "one";
        } else if(i==2){
            return "two";
        }
        return "none";
    }
 
    public static void main(String[] args) {
        System.out.println(num(1));
        
//이 예제는 return이 자주 등장하지만 구문 실행에문제가 전혀 없다.
 public static String getMember1() {
        return "최진혁";
    }
 
    public static String getMember2() {
        return "최유빈";
    }
 
    public static String getMember3() {
        return "한이람";
    }
 
    public static void main(String[] args) {
        System.out.println(getMember1());
        System.out.println(getMember2());
        System.out.println(getMember3());
  public static String[] getMembers() {
        String[] members = { "최진혁", "최유빈", "한이람" };
        return members;
    }
 
    public static void main(String[] args) {
        String[] members = getMembers();
    }

입력과 출력 (2/6) : 앱이 시작할 때 데이터를 입력 1

자바 에플리케이션도 입력과 출력을 할 수 있을까? 물론이다. 예를들어 사용자의 키보드, 마우스, 터치를 입력으로 받아들일 수 있고, 그에 따른 처리 결과를 모니터나 스피커등으로 출력 할 수 있다

 

class InputDemo{
    public static void main(String[] args){
        System.out.println(args.length);

 - main 메소드의 내용을 구현하면 자바 에플리케이션을 실행할 때 main 메소드가 호출되면서 프로그램이 구동하게 되는 것이다. 이 때 Strings[] args는 입력 값의 파라미터로 동작한다.

- String[] args은 매개변수다. 매개변수는 메소드가 호출될 때 전달된 입력 값을 메소드 내부로 전달하는 역할을 하는 변수다. 이 변수의 데이터형은 String[]인데, String[]은 문자열을 담고 있는 배열이다.

- args.length는 배열의 길이를 의미한다.

 

정리

- String[] args : args 라는 이름을 가진 변수를 정의할 것인데 그 변수는 문자열의 데이터 타입을 담을 수 있는 배열이다

- String[] args는 main 메소드에 들어있는 매개변수(파라미터, 입력값)

- void : 메소드에 출력값이 존재하지 않는다.

 

콘솔환경 또는 터미널환경에서 자바 애플리케이션 실행 : 이 부분 다시 볼 필요가 있음. 

 

입력과 출력 (3/6) : 앱이 시작할 때 데이터를 입력 2

- one을 입력. for-each 문을 통해 입력한 값을 String e 데이터에 출력한 것. 결과값은 one 하나이므로 one출력

 

- 현재 나와있는 InputForeachDemo 코드는 입력값이 있고, 이 입력값은 프로그램을 동작시킬 때 우리가 프로그램에 제공해주는 환경 중 하나이기 떄문에 평소처럼 Run 버튼을 누른다고 우리가 어떤 입력값을 줄 지 이클립스에 알려줄 방법이 없음. 

- run configuration(실행환경) 직접 세팅해서 일종의 북마크를 할 수 있는 기능?

-arguments -program arguments - one two three 입력 - run (입력값이 InputForeachDemo에 전달됨.)

- 결과 값은 one two three

- 최초로 입력값을 프로그램에게 부여하는 방법. 일종의 초기값을 주는 방법

 

입력과 출력 (4/6) 앱이 실행중에 데이터를 입력 1

- 자바에서 기본적으로 제공하는 라이브러리 중에 scanner을 이용하면 쉽게 사용자의 입력을 잡을 수 있다

- 구동하려는 자바 애플리케이션으로 자바 유틸 패키지안에 있는 스캐너를 가져와서 사용한다는 것.

import java.util.Scanner;
 
public class ScannerDemo {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        System.out.println(i*1000);
        sc.close();
    }

- nextInt() 메소드 : 실행이 멈추고 입력값을 기다리는 것.

- 한계는 매번 입력값을 작성하고 run을 누를떄마다 결과값이 출력은 되지만 입력값은 초기화 된다는 것.

 

입력과 출력 (5/6) 앱이 실행중에 데이터를 입력 2

import java.util.Scanner;
 
public class Scanner2Demo {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()) {
            System.out.println(sc.nextInt()*1000); 
        }
        sc.close();

hasNextInt() : 메소드가 호출, 입력을 기다리고있는 상태.

여기서 엔터를 칠 경우 2가지 경우 발생

  • 중지되있던 자바의 실행을 다시 재생시킴.
  • 사용자가 입력한 값이 정수가 될 수 있는 숫자(int)라면  true를 리턴하고 그것이 정수가 아니라 문자나 다른 것이라면 false를 리턴

- true가 되면 while문의 반복문의 본체를 실행

- false가 되면 sc.close로 인해 애플리케이션 종료

 

입력과 출력 (6/6) 여러형태의 입출력

import java.util.Scanner;
 
public class Scanner3Demo {
 
    public static void main(String[] args) {
        try {
            File file = new File("out.txt");
            Scanner sc = new Scanner(file);
            while(sc.hasNextInt()) {
                System.out.println(sc.nextInt()*1000); 
            }
            sc.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }

생활코딩 내 코드를 그대로 따라했지만 오류가 나는 모습

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	File cannot be resolved to a type
	File cannot be resolved to a type
	FileNotFoundException cannot be resolved to a type

	at org.opentutorials.javatutorials.io.Scanner3Demo.main(Scanner3Demo.java:10)
    
    스레드 "main" java.lang에서 예외가 발생했습니다.오류: 해결되지 않은 컴파일 문제:

댓글 확인 :

- 프로젝트내에 자바에서 파일로부터입력과 출력을 할 수 있도록 해주는 라이브러리를 임포트해서 그렇습니다.

- ctrl+shift+O 를 누르면 필요한 라이브러리를 전부 import할 수 있습니다.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Scanner3Demo {

	public static void main(String[] args) {
        try {
            File file = new File("out.txt");
            Scanner sc = new Scanner(file);
            while(sc.hasNextInt()) {
                System.out.println(sc.nextInt()*1000); 
            }
            sc.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }

실제로 동작이 된다! ctrl+shift+O이 무슨 기능인지 여기서 왜 동작이 안됬는지 확인 필요함.

catch(예외) 

FileNotFoundException : out.txt 라는 파일을 찾을수 없는 상황이 생긴다면 

e.printStackTrace : 에러의 내용을 화면에 출력

 

CLI

GUI

 

시즌1을 마무리하며

- 자바가 PHP나 JavaScript, Python과 같은 언어보다 어려운 이유는 객체지향 때문이라고 해도 과언이 아니다.

- 이들 언어도 자바와 유사한 객체지향 기능을 가지고 있지만 객체지향을 모르고도 프로그래밍이 충분히 가능하다.

- 반면에, 자바는 객체지향을 사실상 강제한다.

- 객체지향을 안 쓰고도 훌륭한 Python 프로그램을 만들 수 있지만, 객체지향을 모르고 좋은 Java 프로그램을 만들수는 없다. 

 

우리에게 필요한 것은 시간이다. 사람에게는 어떤 일을 시작하기 전에 그 일을 완수하기 위한 시간을 배정하는 습관이 있는 것 같다. 그 시간을 너무 짧게 잡으면 그 시간을 다 사용했을 때 그 일을 포기하게 될 확률이 높다

필자가 부탁하고 싶은 것은 지금 생각하고 있는 것 보다 더 많은 시간을 이 일에 할당해 달라는 것이다. 당분간은 머릿속에서 수많은 개념들이 난리를 칠 것이다. 그리고 그 소동은 곧 잠잠해 질 것이다. 이것은 둘 중의 하나다. 잊어버렸거나, 완전히 내것이 되었거나.

'Java > 생활코딩' 카테고리의 다른 글

생활코딩 자바입문 (나의앱 만들기)  (0) 2021.05.10
생활코딩 자바 입문 리뉴얼  (0) 2021.05.10
생활코딩 - 자바입문 (시즌2)  (0) 2021.05.05