본문 바로가기
Programming/JAVA

JAVA1 - 생활코딩

by DONGKU 2020. 6. 3.

출처: 생활코딩 JAVA1


Java 동작 원리

  1. source code 작성 .java
  2. 기계어로 전환해서(compile) 자바 애플리케이션 생성 .class
  3. 이클립스가 JVM에게 .class 파일 실행하라고 명령
  4. 컴퓨터 동작

프로젝트 생성

  1. Create a Java project
  2. name 설정
  3. location 폴더 설정
  4. next -> finish
    (Project layout - Create separate folders for sources and class files
    src라는 폴더에 소스코드 보관, compile한 결과는 bin이라는 폴더에 저장 ->이렇게하면 Run은 따로?)
  5. 프로젝트 파일 오른쪽 클릭
  6. New -> file -> 파일명.java -> Finish
    코드 작성 후 저장(ctrl+s)하면 .class 파일 생성

데이터와 연산

컴퓨터는 '데이터'를 '처리'하는 기계입니다. 데이터마다 처리방법이 다릅니다. 그래서 데이터의 분류를 아는것이 중요합니다. 여기서는 '데이터'와 '처리'의 의미에 대해서 알아봅니다.

sout + 'ctrl+space' -> 자동 완성

System.out.println("1111".length()); -> "".length() 문자열 길이 알려주는 함수

※프로그래밍에서는 데이터의 타입이 존재. 데이터의 타입을 구분하는 이유는 타입 별로 타입에 어울리는 연산 방법이 있기 때문에 엄격하게 구분!

컴퓨터를 다루는 스킬을 쌓아가는 흐름

  1. 시스템의 데이터 타입들이 어떤 것인지
  2. 각각의 데이터 타입 별 어떤 연산 방법이 있는지

숫자와 연산

이 수업에서는 가장 중요한 데이터 타입인 숫자와 문자의 처리 방법을 살펴봅니다.

Operator: 연산자

저~엉말 편리한 프로젝트 내 자바 소스 파일 생성:

Project 이름 우클릭 -> New -> Class -> Name: 입력, 체크박스 public static void main(String[] args) 체크 시 출력


문자열 다루기

System.out.println("Hello World"); // ""String
System.out.println('H'); // ''Character
System.out.println("H"); // String

// new line
System.out.println("Hello \nWorld");

// escape '\'를 통해 그 뒤에 따라오는 임무가 있는 문자를 일시적으로 해방시킴
System.out.println("Hello \"World\""); 
//Hello "World" // "는 문자의 시작과 끝을 알리는 특수한 문자

//문자열이라는 데이터타입을 표현할 수 있게 되면 
//문자열과 관련된 자바의 내장되어 있는 여러가지 문자를 처리하는 기능 이용
System.out.println("Hello World".length()); // 11
System.out.println("Hello, leezche ... bye. ".replace("leezche", "egoing")); // replace("","")
System.out.println("Hello, [[[name]]] ... bye. ".replace("[[[name]]]", "egoing"));

변수의 정의,효용, casting

변수란 데이터에 붙이는 이름입니다. 이름을 붙이기 전까지 우리는 그 데이터를 부르기 어렵고, 기억하기 어렵고, 이해하기 어렵습니다. 이 수업에서는 바로 이 변수를 배웁니다.

int a = 1; // Number -> integer
System.out.println(a);

double b = 1.1; // real number -> double
System.out.println(b);

String c = "Hello World"; // String 문자열 자료형
System.out.println(c);

데이터 타입(자료형) 지정 이유: 변수를 자료형에 담으면 값을 넣을 때 까다롭지만, 
꺼낼 때 마다 정수인지 문자열인지 확인할 필요가 없다. 무조건 선언된 자료형에 속하므로.
# 

String name = "leezche";
System.out.println("Hello, "+name+" ... "+name+" ... egoing ... bye");
//출력문에서 변수를 나타낼땐 +name+ (+ 해줘야함)

double VAT = 10.0;
System.out.println(VAT);

double a = 1.1;
double b = 1; // 소수점 손실x
double b2 = (double) 1;
System.out.println(b); // 1.0 // 자동으로 1이 1.0으로 컨버팅

//int c = 1.1;
double d = 1.1; // 1.1
int e = (int) 1.1; // 1 소수점 손실
System.out.println(e);

// 1 to String
String f = Integer.toString(1); // int to string 형 변환
System.out.println(f.getClass()); 
// getClass()함수는 변수가 갖고 있는 값이 어떤 데이터 타입인지 알려줌
// casting: 데이터 타입을 다른 데이터 타입으로 컨버팅

구선생: java int to string


프로그래밍이란?

시간의 순서에 따라서 일어나야 하는 일을 컴퓨터에게 알려주는 일이 프로그래밍입니다. 프로그래밍을 통해서 만든 결과물이 프로그램입니다. 이 수업에서는 프로그래밍의 의미를 파악해보고, 이미 우리가 혁명적인 능력을 갖게 되었다는 것을 설득시켜드릴 것입니다

인간이 수행하기 어려운 작업들을 프로그램을 통하여 효율적으로 처리할 수 있다.
※어떤 일이 시간의 순서로 먼저 일어나야할까? 생각!

다른 사람의 부품을 나의 프로젝트에 포함시키기: org 폴더를 프로젝트 폴더로 복사
class 새로 생성시 Package 채워져 있는 것 지워서 default 만들기 (why?)

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;


public class Ok_javaGoinHome {

    public static void main(String[] args) {

        String id = "JAVA APT 517"; //중복 방지 위해 변수 선언

        // Elevator call
        Elevator myElevator = new Elevator(id); // import 시켰으므로 org.opentutorials.iot.Elevator라고 쓸 필요없이 Elevator // Elevator라는 데이터 타입 선언 
        myElevator.callForUp(1);

        // Security off
        Security mySecurity = new Security(id);
        mySecurity.off();

        // Light on
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();

        Lighting floorLamp = new Lighting(id+" / floor Lamp");
        floorLamp.on();

    }

}

Light + 'ctrl + space' // Light라는 이름의 클래스들을 추천과 동시에 import문 까지 자동 추가


디버거

입문자일수록 개념을 적게, 도구는 많이 사용해야 합니다. 중급으로 나아갈수록 지식의 양이 기하급수적으로 늘어납니다. 이때 스스로 모르는 것을 찾아내기 위해서는 도구가 필요합니다. 정말 유용한 도구인 디버거를 소개합니다.

디버거: 문제 해결을 도와주는 도구

break point: 멈출 곳에서 더블클릭

상태바에서 벌레 모양 클릭 -> f5(step into, 메소드 확인), f6(step out) 눌러 진행

resum(재생버튼): 다음 브레이크 포인트까지 한 번에 실행(한 번 더찍어놓아야 함)

정지 버튼 눌러 terminate


입력과 출력

똑같은 결과를 출력하는 프로그램은 일회용입니다. 하지만 입력에 따라서 다른 출력 결과를 만들어주는 프로그램은 다양한 상황에서 힘을 발휘할 수 있습니다. 여기서는 재활용 가능한 프로그램을 만드는 방법을 살펴봅니다.

INPUT -> PROGRAM -> OUTPUT

import javax.swing.JOptionPane;

import org.opentutorials.iot.DimmingLights;
import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class Ok_javaGoinHomeInput {

    public static void main(String[] args) {

        String id = JOptionPane.showInputDialog("Enter a ID");
        String bright = JOptionPane.showInputDialog("Enter a Bright level");

        // Elevator call
        Elevator myElevator = new Elevator(id); // import 시켰으므로 org.opentutorials.iot.Elevator라고 쓸 필요없이 Elevator // Elevator라는 데이터 타입 선언 
        myElevator.callForUp(1);

        // Security off
        Security mySecurity = new Security(id);
        mySecurity.off();

        // Light on
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();

        Lighting floorLamp = new Lighting(id+" / floor Lamp");
        floorLamp.on();

        DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
        moodLamp.setBright(Double.parseDouble(bright)); // string to double conversion
        moodLamp.on();

    }

}

구선생: java popup input text swing
JOptionPane.showInputDialog("Enter a ID"); //JOptionPane(swing)을 통해 다이얼로그창 띄움, swing import 필수

구선생: java string to double conversion
moodLamp.setBright(Double.parseDouble(bright)); // string to double conversion

arguments and parameter

public class Ok_javaGoinHomeInput {
    // parameter, 매개변수
    public static void main(String[] args) { //문자열로 이루어진 배열 args //Configuration에서 입력한 값이 args 로 들어옴

        String id = args[0]; // 첫번째 " " 입력값
        String bright = args[1]; // 두번째 " " 입력값

        // Elevator call
        Elevator myElevator = new Elev

이클립스에서 실행할 때 입력값 주기:

  1. 실행 옆 ▼버튼

  2. Run configurations

  3. Java Application

  4. 실행 중인 프로젝트(여러 값 비교할 경우 오른쪽 클릭 후 복사본 만들어서 하기)

  5. Arguments(인자) tap

  6. Name: Project - 인자값(ex) Project -2000)

  7. Program arguments 입력 "Java APT 507" "15.0" (여러 어절 일 경우 " " 띄어쓰기 " "로 여러개 구분)

  8. public static void main(String[] args) { //문자열로 이루어진 배열 args //Configuration에서(사용자가) 입력한 값이 args 로 들어옴

    자주 사용하는 프로그램들 실행 옆 ▼버튼 목록 추가하기:

  9. 실행 옆 ▼버튼 organize Favorites

  10. Add

  11. 프로젝트 추가

p.s) 영철님의 좋은 댓글

argument : 호출인자 -> 함수의 호출 부분에서 사용됨
parameter : 매개변수 -> 함수의 정의 부분에서 사용됨

Sum(1, 2);

int Sum(int n, int m){
return n+m;
}
위와 같을 때
Sum(1, 2); 의 1과 2는 argument
int Sum(int n, int m) 의 n과 m은 parameter


내 힘으로 컴파일

이클립스 없이 직접 컴파일하고, 실행하는 방법을 알아봅니다. 이클립스에서 독립합시다!

Compile: .java -> .class

Run: .class 실행

Input: 실행할 때 입력값 줘서 입력값에 따른 다른 출력값 확인

-
cmd창에서 javac 와 java 입력하면 사용법 출력, 중요! (path 환경 변수 입력된 상태에서만!, tistory 글 참고)

윈도우에서 컴파일 하기 위해선 소스코드가 있는 디렉토리로 이동해야함

Compile(class파일 만들기):

  1. javac Ok_javaGoinHomeInput.java // javac 파일명.java
  2. ls or dir 명령어로 확인 //error 뜰경우 javac -cp "." 파일명.java

Run 하는법: java Ok_javaGoinHome // java 파일명(확장자없이)

Library: 다른 사람들이 사용할 수 있도록 잘 정리정돈된 코드

-
import: class를 로드

라이브러리 파일 경로가 바꼇거나 다른 위치에 있는 라이브러리를 불러와야 할 경우(임의의 경로 lib 아래에 패키지파일 존재)
javac -cp ".;lib" Ok_javaGoinHomeInput.java //--class path or -cp // 경로는 큰 따옴표로 표시".(현재위치);(윈도우는 세미콜론으로 위치 구분)lib"
java -cp ".;lib" Ok_javaGoinHome // Run 할 때 마찬가지로 -cp "경로" 넣어주기

Input: 직접 컴파일 하고 실행할 때 '입력값'에 따라 다르게 동작하는 프로그램을 어떻게 실행시키는가

-

public static void main(String[] args) { //문자열로 이루어진 배열 args //Configuration에서 입력한 값이 args 로 들어옴

        String id = args[0];
        String bright = args[1];

java Ok_javaGoinHomeInput "Java APT 507" 15.0 // cmd 명령어 뒤에 인자 추가

※명령어 이용 앱 실행을 통해 입력값을 넣을 시 좋은 점
이 프로그램이 원하는 대로 동작하는지 여부를 쉽게 알 수 있다.


자바 문서 보는 법

자립의 핵심기술은 공식 문서를 보는 법입니다. 공식문서를 보기 위해서는 자바에서 코드의 뼈대를 형성하는 몇가지 개념들에 대한 이해가 조금 필요합니다. 이 수업에서는 문서를 보기 위해서 필요한 약간의 개념과 그 개념을 바탕으로 문서를 보는 법을 같이 경험해봅니다.

-
UI: User Interface

API: Application Programming Interface

구선생: api documentation java 자바 공식 문서 -> Tree: 상속 관계를 나무로 보여줌
ex)
java.lang //package
Class Math //class

package: 서로 연관된 비슷한 성격의 클래스를 모아 이름을 붙인 것

class: 서로 연관된 변수와 메소드라는 것을 모아 이름을 붙인 것, Directory와 비슷


Class:

서로 연관된 변수와 메소드라는 것을 모아 이름을 붙인 것

class 사용법: Class.정의

System.out.println(Math.PI); // Class.정의  // Class = Directory!
System.out.println(Math.floor(1.6)); //Math 클래스 내림
System.out.println(Math.ceil(1.6)); //Math 클래스 올림

Instance:

Class의 작업이 '일회용이 아닌 긴 맥락의 꼬리에 꼬리를 무는 경우' Class를 복제한 Instance를 만드는 것이 더 효율적

-
인스턴스 쓰는 이유 : 클래스에 직접 입력 시 동작이 많아지면 일일히 쓰는 불편함이 있음.
반복하는 작업 시 효과적

import java.io.FileNotFoundException;
import java.io.PrintWriter; // Class를 사용하기 위한 import

public class InstanceApp {

public static void main(String[] args) throws FileNotFoundException { 
// 파일을 읽을 때 예외 상황이 생기는데, 일단 파일 빨간줄 오류에서 
// Add throws declaration 클릭 후 IO 선택

PrintWriter p1 = new PrintWriter("result1.txt"); 
// new (Class)PrintWriter("") , Math. 와는 사용법이 다름 
// p1은 PritWriter라는 Class의 Instance // 자료형으로 PrintWriter Class 선언 // new를 통해 클래스를 복제해서 p1에 넣음                                             
p1.write("Hello 1");
p1.close();

PrintWriter p2 = new PrintWriter("result2.txt");
p1.write("Hello 2");
p1.close();

// Instance를 쓰지 않았을 경우
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result1.txt", "Hello 1");   
// PrintWriter라는 하나의 Class를 write Method가 돌려 쓰고 있다.
// but, 위의 PrintWriter는 new를 통해 Instance를 만들었고 
//그 Instance는 내부적으로 각자의 상태를 가짐, p1은 result1.txt p2는 result2.txt 
// p1.write p2.write 처럼 간결하게 쓸 수 있다
//      PrintWriter.write("result2.txt", "Hello 2");
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result2.txt", "Hello 2");
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result2.txt", "Hello 2");
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result2.txt", "Hello 2");
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result2.txt", "Hello 2");
//      PrintWriter.write("result1.txt", "Hello 1");    
//      PrintWriter.write("result2.txt", "Hello 2");
    }

}

Run 후 프로젝트파일 Refresh 하면 파일 생성

Math. Class와 PrintWriter() Class의 차이 : Constructor(Class?)를 이용해서 Instance를 만드는 것이 허용되있다.(Instance O)


상속:

처음부터 끝까지 모든 기능을 만들기 힘드니 이미 있는 Class를 물려받아 자기가 원하는 Method와 변수를 추가한 것

java.lang.Object
java.io.Writer // Writer라는 Class는 Object라는 Class를 상속받았다
java.io.PrintWriter // PrintWriter 라는 Class는 Writer 라는 Class를 상속받았다

class Writer extends Object // Object를 확장해서 Writer를 만들었다

override: 부모 클래스에서 정의된 메소드를 자식클래스에서 재정의해서 사용할 수 있음. 이때 우선적으로 실행되는 메소드는 자식클래스에서 정의한 메소드임.

이클립스에서 Class 오른쪽 클릭 -> Type Hierarchy 누르면 Class의 상속 관계 보여줌


같은 값들 한 번에 변수화: 오른쪽 클릭 -> Refactor -> Extract Local Variable -> 변수명 입력

but 일괄적으로 바꿔버리면 바뀌지 말아야할 같은 값들도 바뀌는 위험이 있음

jvm 이 설치 되어 있지 않은 컴퓨터에서 java Application 실행하기:

launch4J


.

댓글