Hyun's Wonderwall

[Java] 생활코딩 Java 입문 수업 강의 메모 (완강) 본문

Study/Java, Spring

[Java] 생활코딩 Java 입문 수업 강의 메모 (완강)

Hyun_! 2023. 2. 28. 23:41

생활코딩 Java 입문 수업

 

생활코딩 JAVA 입문 수업 - 생활코딩

본 수업은 2019년에 제작된 자바 수업으로 2013년에 제작된 생활코딩 JAVA 수업의 리뉴얼된 수업입니다.  수업소개 이 수업은 가장 인기있는 컴퓨터 언어인 Java의 기본을 알려드리는 수업입니다.

opentutorials.org


[01. 수업소개]

- 뒤로 갈수록 덜 중요한 게 나온다. 빨리 그만두는 것 = 졸업하는 것!

[02. 자바 설치]

- 온라인 편집기를 개발환경으로 이용하기: jdoodle https://www.jdoodle.com/online-java-compiler/

jdk 1.8 설치 완료

[03. 자바 개발환경 셋팅하기 - 이클립스]

- 이클립스 설치 완료

[04. 자바 애플리케이션 실행]

- Hello World 출력

  • 이클립스 run 단축키: ctrl + F11

[05. 자바 기술의 응용]

(1) 자바로 데스크탑 앱 만들기

레이아웃 창 크기 컨트롤 할 수 있다.

GUI: Graphic Use Interface

 

(2) 자바로 사물 제어하기

IoT(사물인터넷): Internet of Things

라즈베리파이: 교육용으로 만들어진 사물인터넷 컴퓨터.

라즈베리파이 구성: 모니터 단자, 전원 단자, 키보드&마우스 단자, GPIO (LED 연결함)

자바를 이용해 “n번핀에 전류를 흐르게 해!” 라고 할 수 있다 → 자동화 가능해짐

LED를 Hello 모스 부호로 불을 켜볼 것이다

pin.high(): 불 켜짐 / pin.low(): 불 꺼짐

Thread.sleep(SHORT_INTERVAL) 또는 Thread.sleep(LONG_INTERVAL): 시간 컨트롤

 

(3) 자바로 안드로이드 앱 만들기

- android development documentation

- android studio download


[06. 데이터와 연산]

(1) 데이터 타입 - 숫자, 문자

 

(2) 데이터 타입 - 출력

System.out.println() : 자바의 기본 출력 메소드 (단축키: sysout, sout)

괄호 안에 - 숫자 입력 : Number / “ ” : String / ‘ ‘ : Char

+) 위 메소드에 대한 설명: https://sangwoo0727.github.io/java/JAVA-sysout/

+) 다른 출력 메소드들 print, printf: https://developer-yeony.tistory.com/74

+) 현업에선 println 사용 지양: https://velog.io/@destiny1616/System.out.println-사용을-자제해야-하는-이유

+) 함수와 메소드의 차이: https://zeddios.tistory.com/233

 

(3) 숫자와 연산 - 클래스 생성, Operator, Math.

[java 파일 쉽게 만들기]

프로젝트 우클릭→New→Class→Name에 소스코드명 입력 ”Which method stubs would you like to create?”에서 ✅ public static void main(String[] args) 체크

⇒ 메소드 생성

 

[Operator 연산자] + : 덧셈, - : 뺄셈, * : 곱셈, / : 나눗셈

[Operand 피연산자] 항, 연산 대상

[Math 클래스] Math.PI : 원주율 Math.floor() : 내림 Math.ceil() : 올림

//Number.java
public class Number {

	public static void main(String[] args) {
		//연산자: Operator
		System.out.println(6+2); //8
		System.out.println(6-2); //4
		System.out.println(6*2); //12
		System.out.println(6/2); //3
		
		System.out.println(Math.PI); //3.141592653589793
		System.out.println(Math.floor(Math.PI)); //3.0 내림
		System.out.println(Math.ceil(Math.PI)); //4.0 올림
	}
}

 

(4) 문자열 표현 - "", \n, \"

  • 문자열 줄바꿈: \n
  • 문자열 따옴표 출력: \" (이런걸 escape sequence라고 한다.)
  • 문자열은 "" 을 사용

(5) 문자열 다루기 - 문자열 치환 replace()

  • replace() 메소드로 문자열 값 쉽게 바꾸기
  • 형태: replace([기존문자], [바꿀문자])
//StringOperation.java
public class StringOperation {

	public static void main(String[] args) {
		System.out.println("Hello World");
		System.out.println("Hello, [[name]] ... bye".replace("[[name]]", "Lee"));
		//Hello, Lee ... bye 출력

		String a = "Hello";
		a= a.replace("el", "a");
		System.out.println(a);
		//Halo 출력
	}

}

[07. 작심삼일 공학]

언제든지 공부를 그만하고 일을 하고, 언제든지 일을 그만하고 공부를 하라 (=파이팅!)


[08. 변수]

(1) 변수의 정의 - datatype

    변수: 데이터를 담는 곳에 붙이는 이름, 값이 변할 수 있다.
    자바는 변수를 만들 때 어떤 datatype이 들어가는지 지정해주어야 한다. (c언어처럼)
    int: 정수형, double: 실수형, string: 문자열

 

(2) 변수의 효용 - System.out.println(“문자열”+변수+”문자열”);    
    값을 바꿔야 할 때 좋다

//Letter.java
public class Letter {
 
    public static void main(String[] args) {
        String firstname = "Gildong";
        String lastname = "Hong";
        System.out.println("Hello, "+firstname+" "+lastname+" ... (content) ... bye");
        //Hello, Gildong Hong ... (content) ... bye
        double VAT = 10.0;
        System.out.println(VAT);
        //10.0
    }
 
}

 

(3) 데이터 타입의 변환 (casting) - (타입) 피연산자

형변환 Type Conversion: 객체의 datatype을 다른 datatype으로 convert한다.

형변환의 종류: Promotion, Casting

- 변수 여러개 출력은 (a+” “+b) 이런 식으로

- 정수를 문자열로: String str1 = Integer.toString(i); //i는 정수, st1은 변수명

- getclass() 메소드: 객체가 속하는 클래스를 확인할 수 있는 메소드

//Casting.java
public class Casting {

	public static void main(String[] args) {
		double a = 1.1;
		double b = 1; //자동적으로 정수인 1이 실수인 1.0으로 converting된다
		//데이터 타입 바꿔도 데이터 손실 없으므로
		double b2 = (double) 1; //casting으로 명시적으로 데이터타입 바꿔주는 방법
		
		//System.out.println(a);
		//System.out.println(b);
		//System.out.println(b2);
		System.out.println(a+"\\n"+b+"\\n"+b2+"\\n");
		
		//int c = 1.1; //1.1을 정수형으로 바꾸면 데이터 손실이 일어나므로 error 발생
		double d = 1.1; //data type을 double로 바꾼다
		int e = (int) 1.1; //casting
		System.out.println(d+", "+e+"\\n");
		
		//1 to string
		//String str1 = Integer.toString(i)
		String f = Integer.toString(1);
		System.out.println(1+10);
		System.out.println(f+10);
		//getclass() 메소드: 객체가 속하는 클래스를 확인할 수 있는 메소드
		System.out.println(f.getClass());
	}

}

[09. 프로그래밍이란 무엇인가?]

(1) 프로그래밍이란 무엇인가 - 목표: 자동화

- 프로그램: 시간의 순서에 따라 진행되는 것, 실행되는 것.

 

(2) 프로그램 만들기 - 소스 코드 내려받아 사용하기

- 다른 사람의 코드 디렉토리를 내 프로젝트에 추가: 폴더 전체를 프로젝트에 복사 및 붙여넣기 (copy files and folders)

 

(3) IOT 프로그램 만들기 - package 패키지명; , import 패키지명.클래스명;

//OkJavaGoInHome.java & 패키지 org.opentutorials.iot

  • Package 패키지: 클래스의 묶음. (=디렉토리=폴더)
    - 클래스들을 구분지어 체계적으로 관리하기 위해 사용된다. 클래스를 유일하게 만들어주는 식별자로, 클래스의 일부분이다. 패키지와 클래스는 .를 사용해서 구분한다.
    - package 키워드는 이 파일이 어떤 패키지의 파일인지를 알려주는 역할을 한다.
    어떤 패키지에서 클래스를 생성하면 package 패키지명;이 자동으로 삽입된다.
package 상위패키지명.하위패키지명;

*패키지 이름 규칙: 모두 소문자로 작성하는 것이 관례이다. 숫자 시작x, java로 시작x, int 등 자바 예약어x.
*회사의 경우 흔히 회사의 도메인 이름 역순으로 패키지 이름을 짓는다.

  • Import 임포트: 다른 패키지의 클래스를 사용할 때 import 명령어를 사용해 클래스를 호출하면, (속한 패키지 정보 작성 없이) 클래스를 이름으로 사용할 수 있다.
import 상위패키지명.하위패키지명.클래스명;

ex. 1) import 사용 전: org.opentutorials.iot.Elevator myElevator = new org.opentutorials.iot.Elevator(id);

      2) import org.opentutorials.iot.Elevator; 사용 후: Elevator myElevator = new Elevator(id);

 

Elevator.java

* package org.opentutorials.iot;

package org.opentutorials.iot;

public class Elevator {
	String _id;
	public Elevator(String id) {
		this._id = id;
	}

	public Boolean callForUp(int stopFloor) {
		System.out.println(this._id+" → Elevator callForUp stopFloor : "+stopFloor);
		return true;
	}
	
	public Boolean callForDown(int stopFloor) {
		System.out.println(this._id+" → Elevator callForDown : "+stopFloor);
		return true;
	}
}

OkJavaGoInHome.java

* org.opentutorials.iot 패키지의 클래스들을 임포트했다

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

public class OkJavaGoInHome {

	public static void main(String[] args) {
		
		String id = "JAVA APT 507";
		// Elevator call
		//org.opentutorials.iot.Elevator 쓰는 것 대신 import
		Elevator myElevator = new Elevator(id);
		myElevator.callForUp(1); //1층으로 엘리베이터 보내기
		
		// Security off
		Security mySecurity = new Security(id);
		mySecurity.off(); //괄호 붙어있는 명령은 '메소드'
		
		// Light on
		Lighting hallLamp = new Lighting(id+" / hallLamp");
		hallLamp.on();
		Lighting floorLamp = new Lighting(id+" / floorLamp");
		floorLamp.on();
		
	}

}

[10. 디버거]

벌레 아이콘 클릭(’Debug 파일명’) → 디버깅 시작

오른쪽 끝의 Perspective: Java / Debug (템플릿 기능, switch 가능)

Step Over(F6): 명령 한 줄씩 실행 (하나하나 체크)

디버깅 중에 한줄씩 가리키는 화살표: Debug Current Instruction Pointer

줄 왼쪽 더블클릭: Line Breakpoint

* Resume: breakpoints에만 멈춤

* Variables 패널: 변수 확인

* Step Into: 메소드 안으로 들어감 (다른 파일로 갈수도)

* Step Return: 메소드 바깥으로 나감 (기존 파일로)

* 🟥 Terminate: 디버그 끝


[11. 입력과 출력]

(1) 입력과 출력 - swing 처음 등장, import 사용법, 메소드 개념, JOPitionPane.showInputDialog()

INPUT → PROGRAM → OUTPUT

INPUT을 어떻게 주냐? →다양한 방법으로 가능

하고 싶은 것_ 프로그램 수정 시 팝업이 뜨고 거기에 텍스트 입력할 수 있으면 좋겠다.

구글에 “java popup input text swing” 검색

String path = JOPitionPane.showInputDialog(”Enter a path”);

자바의 Swing

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

import javax.swing.JOptionPane;

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

public class OkJavaGoInHomeInput {

	public static void main(String[] args) {
		
		String id = JOptionPane.showInputDialog("Enter a ID");
		String bright  = JOptionPane.showInputDialog("Enter a Bright Level");
		// Elevator call
		//org.opentutorials.iot.Elevator 쓰는 것 대신 import
		Elevator myElevator = new Elevator(id);
		myElevator.callForUp(1); //1층으로 엘리베이터 보내기
		
		// Security off
		Security mySecurity = new Security(id);
		mySecurity.off(); //괄호 붙어있는 명령은 '메소드'
		
		// Light on
		Lighting hallLamp = new Lighting(id+" / hallLamp");
		hallLamp.on();
		Lighting floorLamp = new Lighting(id+" / floorLamp");
		floorLamp.on();
		
		DimmingLights moodLamp = new DimmingLights(id+"mood");
		moodLamp.setBright(Double.parseDouble(bright));
		moodLamp.on();
		
	}

}

 

(2) 입력과 출력 - 이클립스의 Run Configurations 사용법

argument: 명령어, parameter: 매개변수, 인자

명령어로 실행되는 프로그램에 파라미터를 통해서 인자를 전달하는 방식을 배워본다

 

Run → Run Configurations 클릭시 자바 어플리케이션 리스트가 쭉 나온다

프로젝트, 메인 클래스 구조 확인

arguments 탭에서 따옴표(””)로 묶어 입력값 적어주기, 각각의 입력값은 띄어쓰기로 구분

apply 저장 run 실행

자바 어플리케이션의 이름을 수정 가능 - 입력값이 뭔지 적어놓고 싶다면 어플리케이션 이름을 클래스 - '값' '값' 이렇게 적어둘 수 있다

  • JOptionPane.showInputDialog() : 입력창을 띄워서 입력값을 받아서 사용
  • args[] : Run Configuration에서 입력해둔 값을 args 배열에 넣어서 사용 바로 args[0], args[1] ...

다른 값도 이것저것 실행하고 싶으면

어플리케이션 복제하고 입력값 바꾸고 run

자주사용하는 버튼은 목록에 추가 가능 (organize favorites 즐겨찾기)

String id = args[0] //JOptionPane.showInputDialog("Enter a ID");
String bright  = args[1] //JOptionPane.showInputDialog("Enter a Bright Level");

[12. 내 힘으로 컴파일 (직접 컴파일하고 실행하기)]

(1) 소개 - 배울 것들

[1] .java를 .class로 바꾸기

[2] .class 실행

[3] 입력값에 따라 다르게 동작하는 출력값 만들기

 

(2) 실행환경 - path 환경변수

환경변수 설정하기: 내 컴퓨터>속성>고급 시스템 속성>환경변수 사용자 변수 또는 시스템 변수 편집 가능

cmd에서 명령 내리기: 윈도우+r 키 누르고 cmd 열기

javac로 컴파일 가능: cmd 창에 입력시 사용법이 나온다. Program Files>Java>jdk>bin

java 입력시 java.exe 실행된다: 현재 위치중인 있는 디렉토리에 없으면 path 환경변수에서 찾는다. path 환경변수에 입력해 줬기 때문에 가능

+덧붙임: 자바 프로젝트에서 bin 디렉토리: src 안에 있는 .java 파일들이 .class 파일로 컴파일된 것들이 저장되는 곳

 

(3) 컴파일과 실행하기 - 명령어 cd, dir, javac, java

  • cd: Change Directory (cd C:\Users\SAMSUNG\eclipse-workspace\Programming\src)
  • dir: .java 파일 확인 (dir)
  • javac: 컴파일 (javac 파일.java)
  • java 클래스명: 클래스 실행 (‘Program’이라는 클래스 찾아서 실행, 코드대로 1, 2, 3이 출력되었다)

(4) 라이브러리 이용 - 외부 디렉토리의 클래스 사용하는 경우 - javac -cp “.;lib” 파일.java 또는 클래스명

javac -cp ".;lib" OkJavaGoInHome.java //해당 자바 파일이 필요로 하는 클래스 파일들 자동으로 컴파일해서 생성

java -cp ".;lib" OkJavaGoInHome 하면 lib 디렉토리와 그 이하까지도 찾아서 프로그램 실행. 이렇게 해주자

java OkJavaGoInHome //main 못찾았다고 실행되지 x (elevator 클래스가 lib 폴더 안에 있기 때문에)

java -cp "lib" OkJavaGoInHome //lib 디렉토리에서만 찾는다

 

(5) 입력과 출력 - 이클립스 사용없이, 입력값을 줘서 출력

* 한글 주석 때문에 오류나서 실습하지는 못했다..!

javac OkJavaGoInHomeInput.java

java OkJavaGoInHomeInput 하면 오류 (args 때문에)

java OkJavaGoInHomeInput "Java APT 507" 15.0

java OkJavaGoInHomeInput "Pusan APT 507" 30.0

 

[13. 자바 문서 보는 법]

(1) API vs UI

자바는 우리에게 여러 부품들을 제공해준다 (기본 내장부품: “기본 라이브러리”)

이것들을 조작하는 방법: API (Application Programming Interface)

자바가 제공하는 기본 라이브러리를 사용하는 방법 즉 API 사용하는 방법 배우자

(프로그램은 ‘시간’에, 애플리케이션은 ‘응용’에 방점이 찍혀있는 표현이다.)

  • 사람이 프로그램 조작하기 위해 사용하는 조작 장치: UI
  • 프로그램이 프로그램에게 알려주는 조작 장치: API

[14. 나의 앱 만들기 1], [15. 나의 앱 만들기 2]는 실습

 

[14. 나의 앱 만들기 1]

기본 기능 구현->변수도입->입력값도입
string을 double로 바꿀 경우

double valueOfSupply = Double.parseDouble(args[0]);

[15. 나의 앱 만들기 2]

(1) OT
(2) 제어문(Flow control statements)

- 제어문에는 조건문과 반복문이 있다

if(income > 10000.0) {
	dividend1 = income*0.5;
	dividend2 = income*0.3;
	dividend3 = income*0.2;
}
else {
	dividend1 = income*1;
	dividend2 = income*0;
	dividend3 = income*0;
}

(3) 배열

double[] dividendRates = new double[3];
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;

double dividend1 = income*dividendRates[0];
double dividend2 = income*dividendRates[1];
double dividend3 = income*dividendRates[2];

(4) 반복문

double[] dividendRates = new double[3];
dividendRates[0] = 0.5;
dividendRates[1] = 0.3;
dividendRates[2] = 0.2;
		
int i=0;
while(i < dividendRates.length) {
	System.out.println("Dividend: "+(income*dividendRates[i]));
	i=i+1;
}

(5) 메소드

메소드는 서로 연관된 코드를 그룹핑하여 이름 붙인 것

public static double getIncome(){

return 1;

}

public class AccountingMethodApp {
	public static double valueOfSupply;
	public static double vatRate;
	public static double expenseRate;
	
	public static void main(String[] args) {
		valueOfSupply = 10000.0;
		vatRate = 0.1;
		expenseRate = 0.3;
		print();
	}
	
	public static void print() {
		
		System.out.println("Value of supply: "+valueOfSupply);
		System.out.println("VAT: "+getVAT());
		System.out.println("Total: "+getTotal());
		System.out.println("Expense: "+getExpense());
		System.out.println("Income: "+ getIncome());
		System.out.println("Dividend: "+getDividend1());
		System.out.println("Dividend: "+getDividend2());		
		System.out.println("Dividend: "+getDividend3());
		
	}
	
	public static double getDividend1() {
		return getIncome()*0.5;
	}
	public static double getDividend2() {
		return getIncome()*0.3;
	}
	public static double getDividend3() {
		return getIncome()*0.2;
	}
	
	public static double getIncome() {
		return valueOfSupply-getIncome();
	}

	public static double getExpense() {
		return valueOfSupply*expenseRate;
	}

	public static double getTotal() {
		return valueOfSupply + getVAT();
	}

	public static double getVAT() {
		return valueOfSupply*vatRate;
	}

}

(6) 클래스

오브젝트=객체

클래스는 서로 연관된 변수, 메소드를 그룹핑한 것이다

클래스.변수

클래스.메소드()

소속관계 명확히

class Accounting{
	public static double valueOfSupply;
	public static double vatRate;
	public static double expenseRate;
	
	public static void print() {	
		System.out.println("Value of supply: "+valueOfSupply);
		System.out.println("VAT: "+getVAT());
		System.out.println("Total: "+getTotal());
		System.out.println("Expense: "+getExpense());
		System.out.println("Income: "+ getIncome());
		System.out.println("Dividend: "+getDividend1());
		System.out.println("Dividend: "+getDividend2());		
		System.out.println("Dividend: "+getDividend3());
	}
	
	public static double getDividend1() {
		return getIncome()*0.5;
	}
	
	public static double getDividend2() {
		return getIncome()*0.3;
	}
	
	public static double getDividend3() {
		return getIncome()*0.2;
	}
	
	public static double getIncome() {
		return valueOfSupply-getExpense();
	}

	public static double getExpense() {
		return valueOfSupply*expenseRate;
	}
	
	public static double getTotal() {
		return valueOfSupply + getVAT();
	}

	public static double getVAT() {
		return valueOfSupply*vatRate;
	}
}

public class AccountingClassApp {
	
	public static void main(String[] args) {
		Accounting.valueOfSupply = 10000.0;
		Accounting.vatRate = 0.1;
		Accounting.expenseRate = 0.3;
		Accounting.print();
	}
}

(7) 인스턴스

인스턴스는 하나의 클래스를 복제해서 - 서로 다른 데이터의 값을 가지고 서로 같은 메소드를 가진 복제본으로 만드는 것이다

인스턴스를 사용할 경우 static이면 안된다.

class Accounting{
	public double valueOfSupply;
  public double vatRate;
  public double expenseRate;
  public void print() {
		//...
	}
	//...
}

public class AccountingInstanceApp {
     
    public static void main(String[] args) {
        // instance 
        Accounting a1 = new Accounting();
        a1.valueOfSupply = 10000.0;
        a1.vatRate = 0.1;
        a1.expenseRate = 0.3;
        a1.print();
         
        Accounting a2 = new Accounting();
        a2.valueOfSupply = 20000.0;
        a2.vatRate = 0.05;
        a2.expenseRate = 0.2;
        a2.print();
    }
}

[수업을 마치며]

나를 위한 프로그램,

나에게 필요하고 중요한 프로그램을 만들라

그것이 곧 보편적인 프로그램이 될 것이다!