[Language]/Java | Spring | JSP

[생활 코딩]자바 입문

soheepark 2022. 4. 9. 23:52
728x90
반응형

1. 출력

public class HelloWorldApp {
	public static void main(String[] args) { //main : method
		System.out.println("Hello World!!");
  }
}
Hello World!!

학교 다닐 때 처음으로 배웠던 간단한 출력 기능.

다시 배우고 있다. 

학교 다닐 때 열심히 할걸 후회해도 지금 다시 열심히 하면 된다.

 

소스코드 이름을 직관적으로 짓자. 

어떤 기능과 구현하려는 목적이 무엇인지 한눈에 파악할 수 있어야 한다.

 

💡class 이름과 맨 위 public class 뒤 이름이 같아야 한다.

 

2. 데스크탑 기능

//desktop App, 데스크탑이 뜨면서 "Hello World!!"가 뜬다.

import javax.swing.*;
import java.awt.Dimension;
import java.awt.Toolkit;
public class HelloWorldGUIApp{
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame("HelloWorld GUI"); //데스크탑 위 표시 될 이름
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫는 기능
				frame.setPreferredSize(new Dimension(400, 300)); //데스크탑 가로세로 크기.
				JLabel label = new JLabel("Hello World!!", SwingConstants.CENTER);
				/*실질적 출력 화면.
				 *CENTER : Hello World!! -> 가운데 배치.
				 *CENTER -> RIGHT : Hello World!! 오른쪽 배치.*/
				frame.getContentPane().add(label);
				Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
				frame.setLocation(dim.width/2-400/2, dim.height/2-300/2);
				
				frame.pack();
				frame.setVisible(true);
			}
		});
	}
}

깜찍하다

구현한 프로그램들을 다 설명하자는 취지는 아님.

자바로 이런 것도 할 수 있다는 의미이다.

언젠간 저 코드들도 너무 쉽다고 느끼는 날이 오겠지?

따봉자바

보다보니 귀엽네

 

💡.java VS .class

  .java .class
인식 주체 사람 컴퓨터

💡자바 동작 원리

[사람 (.java) Java Source Code ] -> compile -> [자바 (.class) Java Application ] -> Run ->

[Java  Virtual Machine ] -> Run -> Computer

*java virtual machine : java 설치 시 자동으로 설치됨.

 

3. 데이터 타입

public class Datatype{
	public static void main(String[] args) {
		System.out.println(6); //숫자 표현 : " " 없이 숫자 입력. (Number)
		System.out.println("six"); //문자표현 : " " 필요. (String)
		
		System.out.println("6"); //String 6 (숫자x)
		
		System.out.println(6+6); //사칙연산, 결과 : 12 (Number)
		System.out.println("6"+"6"); //문자 합치기, 결과 : 66 (String)
		
		System.out.println(6*6); //사칙연산, 결과 : 36
		//System.out.println("6"*"6"); : 문자열 data type은 곱셈 불가능
		
		System.out.println("1111".length()); //1111의 길이 : 4
		//System.out.println(1111.length()); : 숫자의 길이 알려주는 연산은 없음 (에러)
		
		System.out.println("Hello World"); //String
		System.out.println('H'); //Char : 문자 ' '
		System.out.println("H"); //String 형
	}
}
6
six
6
12
66
36
4
Hello World
H
H

String과 Char의 차이를 잘 구분해둬야 한다.

 

4. Operator (연산자)

public class Number {

	public static void main(String[] args) { //main : method
		// 연산자(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); //Math 함수 이용 -> PI값 구하기
		System.out.println(Math.floor(Math.PI)); //floor : 내림
		System.out.println(Math.ceil(Math.PI)); //ceil : 올림

	}

}
8
4
12
3
3.141592653589793
3.0
4.0

Math function의 종류를 인식할 수 있는 날이 오겠지?

 

5. String

public class StringApp {

	public static void main(String[] args) {
		System.out.println("Hello World"); //String : 문자열, 문자가 모여 있는 것.
		//System.out.println('Hello World'); : 자바 -> ' ' : 특수한 데이터 (Character / 문자, 한 글자)
		System.out.println('H'); //Character
		/* <따옴표의 차이>
		 *  " " : String, 문자열 (Character들의 집합) 
		 * ' ' : Character, 문자 */
		
		/* System.out.println("Hello 
		 * World"); 
		 * 위 경우처럼 무작정 띄어쓰면 에러 남.
		 */
		
		//new line (줄 바꿈 기능)
		System.out.println("Hello "
				+ "World"); //정상 실행. 하지만 줄 바꿈은 안됨.
		System.out.println("Hello \nWorld"); //역슬래시+n (\n) : 줄 바꿈
		
		//escape 기능
		//System.out.println("Hello "World""); : 문자 중간 큰따옴표 추가 아무렇게나 하면 안됨.
		System.out.println("Hello \"World\""); // \" 은 "을 출력되게 도와줌.

	}

}
Hello World
H
Hello World
Hello 
World
Hello "World"

띄어쓰기 방식과 \의 발견이었다.

 

6. StringOperation

public class StringOperation {

	public static void main(String[] args) {
		System.out.println("Hello World".length()); //몇 글자인지 알려줌, 띄어쓰기 포함
		System.out.println("Hello, leezche ... bye. ".replace("leezche", "egoing"));
		//leezche -> egoing으로 바꾸기
		System.out.println("Hello, [[[name]]] ... bye. ".replace("[[[name]]]", "duru"));
		System.out.println("Hello, [name] ... bye. ".replace("[name]", "duru"));
		// [ ] 갯수는 크게 상관 없는 것 같다.

	}

}
11
Hello, egoing ... bye. 
Hello, duru ... bye. 
Hello, duru ... bye.

 

7. Variable

//Variable : 변수 (값이 변할 수 있는 문자) 

public class Variable {

	public static void main(String[] args) {
	//a=1; : 변수 이렇게 지정하면 안됨. 변수의 타입을 고려해야. Number -> integer(정수)
		//integer : 1,0,-1 ...
		int a = 1;
		System.out.println(a); //output : 1
		
		//int b = 1.1; : int는 정수, 1.1은 정수 아님 (실수) real number = double
		double b = 1.1;
		System.out.println(b); //output : 1.1
		
		//c = "Hello World"; : 문자열이므로 String (문자열 타입)
		String c = "Hello World";
		System.out.println(c); //output : Hello World
		
		//<자바 : 데이터 타입 지정 필수 이유>
		//편리함 제공 (원인 : 컴퓨터가 값을 꺼낼 때마다 정수인지, 숫자인지 확인하지 않아도 됨)
		//대신 사람이 변수의 타입을 지정해야 하는 번거로움이 있음.
		

	}

}
1
1.1
Hello World

파이썬에서는 변수 값의 타입을 정해주지 않아도

a=1

print(a)

간단하게 작성만 해도 출력이 된다.

가만히 보니 파이썬은 콤마도 안찍는다.

 

자바는 변수명은 지정해줘야 되는 것은 물론,

output을 내야 할 때도 파이썬보다 코드가 길다.

int a=1;

system.out.println(a);

 

자바가 왜 복잡하게 변수명을 지정하냐면,

사람이 변수명을 지정해주면 컴퓨터가 나중에 변수의 타입을 찾지 않아도 된다.

컴퓨터 입장에서는 효율적인 업무 처리가 되는 것이다.

 

그래서 자바가 파이썬보다 더 거대한 서비스를 구축할 때 많이 사용된다. 복잡한만큼 안정적이기 때문이다.

물론 파이썬이라고 큰 서비스를 구축할 때 사용하지 않는 것은 아니다.

예를 들어 인스타그램은 파이썬을 이용한다.

 

한가지 분명한 것은, 자바를 공부하면 파이썬에 금방 적응할 수 있겠다는 점이다.

 

8. 변수의 효율성

public class Letter {

	public static void main(String[] args) {
		String name = "leezche";
		//System.out.println("Hello, egoing ... egoing ... egoing ... bye");
		/*egoing text들을 바꾸는 액션을 취해야 한다. (목표)
		 * */
		System.out.println("Hello, "+name+" ... "+name+" ... egoing ... bye");
		 //변수의 이름을 통해서 '저기엔 이름이 들어가는구나' 추리 가능
		
		double VAT = 10.0;
		System.out.println(VAT);
		/*변수 이유 :
		 * 그냥 System.out.println(10); 입력하면 10이 무엇을 뜻하는지 다른 사람들은 모른다.
		 * 입력값 10의 의미를 전달하기 위해 변수를 선언한다.
		 */
		//VAT(부가가치세)
		
		//코드는 남이 봤을 때 정확하고 신속하게 의미를 파악할 수 있게 짜야 한다.
		//변수를 통해서 효율적인 코드를 만들 수 있다.

	}

}
Hello, leezche ... leezche ... egoing ... bye
10.0

잘 짠 코드

1. 남이 쉽게 알아볼 수 있음

2. 간결함

3. 가독성

 

변수는 내가 아닌 남이 이 코드를 봤을 때 쉽게 이해할 수 있도록 도와주는 매개채이다.

변수를 선언하는 것은 매우 중요하다.

 

9. Converting

//데이터 타입 변환
//자바는 변수의 데이터 타입을 엄격히 통제하기 때문에 변수값을 다른 데이터 타입으로 컨버팅해야 하는 경우
//Converting : '바꿔준다'

public class Casting {

	public static void main(String[] args) {
		
		double a = 1.1;
		//int b = 1;
		double b = 1; //1은 int 타입인데 double로 타입을 지정해줘도 에러가 나지 않음.
		//double b2 = (double) 1; 과 위의 코드와 같은 의미이다.
		
		System.out.println(b); //실행은 잘 되지만 아웃풋은 1이 아닌 1.0으로 나온다.
		//정수의 값이지만 double형(실수)으로 컨버팅이 됨. 
		//잃어버리는 값이 없다. 
		
		//int c = 1.1; : 1.1을 정수형에 담으려하면 에러가 남.
		//0.1을 잃어버리는 현상이 생길 수 있기 때문임.
		
		//int c = 1.1;
	   /* int d = 1.1; : 1.1에 빨간 밑줄(에러 표시) -> 
	    * Add cast to 'int'
	    * Change type of 'd' to 'double'
	    * 두 선택지가 나온다. 밑의 선택지를 클릭하면 아래와 같이 바뀐다. 
	    */
		double d = 1.1;
		System.out.println(d);
		
		/*int e = 1.1; ->
		 * Add cast to 'int' 선택지의 의미는 
		 * 실수값인 1.1을 int값으로 강제로 바꿔주겠다는 뜻이다.
		 */
		int e = (int) 1.1; //1.1을 강제로 int값으로 바꿈 -> output : 1
		System.out.println(e);
		
		//1을 String으로 바꾸려면?
		//검색하면 된다. 검색하는 것은 매우 중요! 책과 강사로부터 독립해야 한다.
		//java int to string casting 검색하면 많이 나온다.
		
		//<int to String>
		String f = Integer.toString(1);
		//Integer값을 String으로 바꾸는 것.
		System.out.println(f.getClass()); //getclass() : 변수값이 어떤 데이터 타입인지 알려줌
		//f는 더이상 int형이 아닌 string형이다.
		

	}

}
1.0
1.1
1
class java.lang.String

/*1
 *class java.lang.String
 *
 *1은 String값으로 지정되었음을 알려주고 있음.
 */

(int a = 1.1; 기준) double형을 int로 바꾸면 손실값(0.1)이 있기 때문에

반드시 명시적으로 표현을 해야 한다.

 

사소한 것이라도 주석을 다는 습관을 가져야 겠다.

쓸데없는 주석은 달지 말 것.

직관적으로 간결하게 필요한 주석만 달 것.

 

주석을 잘 다는 습관이 중요한데 잘 모르겠다.

하다보면 늘 것이다.

 

💡 프로그래밍을 하는 이유

자동화 처리를 위해 !!

 

10. 디버거

bug : 코드 내 의도하지 않은 문제

debug (=debugging)

debugging : 문제를 잡는 행위

debugger : 문제를 잡을 때 사용하는 도구

 

   1) 멈추고 싶은 코드 왼쪽 더블 클릭 -> 점 생김 (브레이크 포인터)

더블 클릭을 다시 하면 없어짐

: 버그 해결 및 코드 분석하고자 할 때 사용

코드 10번 줄 브레이크 포인트

 

11. IOT

집주소 입력 후 집에 들어갈 때마다

-엘레베이터 1층 도착 및 대기

-보안 모드 자동 off

-불 자동 켜짐

//IOT 작동 소스코드

import org.opentutorials.iot.Elevator;
//org 패키지 내 opentutorials 내 iot 내 Elevator 소스코드를 가져와서 쓰겠다는 의미.

public class OkJavaGoinHome {

	public static void main(String[] args) {
		
		String id = "JAVA APT 507"; //java 아파트 507이 주소
		
		//Elevator call
		Elevator myElevator = new Elevator(id);
		//myElevator : 변수명, 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+" / floorLamp");
		floorLamp.on();

	}

}

 

11-2.

//IOT 작동 소스코드 2
//이사갈 때 id값 직접 수정 및 컴파일 : 복잡함
//프로그램 실행 -> 사용자의 주소 직접 입력 -> 아이디값 세팅식으로 바꾸기

import javax.swing.JOptionPane; //JOptionPane 기능 사용하기 위한 swing 기능 추가

import org.opentutorials.iot.Elevator;
//org 패키지 내 opentutorials 내 iot 내 Elevator 소스코드를 가져와서 쓰겠다는 의미.
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoinHomeinput {

	public static void main(String[] args) {
		
		String id = JOptionPane.showInputDialog("Enter your Address");
		//JOptionPane는 우리가 사용할 수 없음. 
		//따라서 마우스 위에 올리고 import joptionpane 클릭하면 맨 위에 swing 기능 생김.
		//showInputDialog : 사용자가 id 입력할 수 있는 창이 뜸.
		String bright = JOptionPane.showInputDialog("Enter a Bright level"); 
		//유저가 입력한 수치값은 string임. (double x) -> string을 double형으로 converting해야함.
		
		//Elevator call
		Elevator myElevator = new Elevator(id);
		//myElevator : 변수명, 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+" / floorLamp");
		floorLamp.on();
		
		//입력값 여러개 한꺼번에 넣고 싶을 때.
		//밝기 조절 가능한 램프 가정
		DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
		moodLamp.setBright(Double.parseDouble(bright)); //10%만큼 밝기
		//setBright(brignt) = double형이 온다고 에러 남. 
		//parse : 분석하다.
		//string bright값 -> double형 bright값 : 에러 x
		moodLamp.on();

	}

}

좌측 소스코드들을 현재의 소스코드로 옮겨와 실행
Ex) Elevator.java -> Elevator 변수 값 지정, main method, callForUp method 지정 필수
마중나오는 귀여운 따봉자바
따봉자바야 고마워 !

12. 패키지, 클래스, 변수, 메소드

package는 class를 groupping,

class는 variable, method를 groupping한 것이다.

 

13. 클래스는 무엇인가?

: 서로 연관된 변수와 메소드를 모아 이름을 붙이는 것.

package org.opentutorials.iot;

public class ClassApp {

	public static void main(String[] args) {
		System.out.println(Math.PI);
		System.out.println(Math.floor(1.6));
		System.out.println(Math.ceil(1.6));
		//class : 서로 연관된 변수와 method들을 모아서 이름을 붙이는 것.

	}

}

-> 여기서 Math는 class임. (Math라는 class 안 많은 수학 기능들이 있음. ex. PI, floor, ceil...)

 

14. 인스턴스

package org.opentutorials.iot;

import java.io.IOException;
import java.io.PrintWriter;
//printwriter는 java.io에 소속되어 있다

public class InstanceApp {

	public static void main(String[] args) throws IOException {
		
	PrintWriter p1 = new PrintWriter("result1.txt"); //PrintWriter의 복제본 만드는 것,p1 : 변수
	//PrintWriter라는 클래스의 인스턴스만 들어간다는 뜻.
	/*PrintWriter의 빨간색 밑줄
	 * Math : 특별한 조치를 사용하지 않아도 사용 가능
	 * printwriter : 자바에 내장되어 있긴 한데 패키지를 가져와야 사용 가능.
	 * -> import 작업 해줘야함.
	 */
	/*new printwriter쪽에 빨간색 밑줄 (import 적었음에도)
	 * 파일 없으면 문제가 있을 수도 있으니 예외를 어떻게 처리해야 할지 정해야 함.
	 * ->Add throws declaration 클릭
	 */
	p1.write("Hello 1");
	p1.close();
	
	PrintWriter p2 = new PrintWriter("result2.txt");
	p2.write("Hello 2");
	p2.close();

	}

}

해당 코드 입력 후

왼쪽 Navigator -> Refresh 클릭

: result1.txt & result2.txt가 새로 생겼다.

 

인스턴스

: 짧은 맥락의 작업들 (system.out.println(math.pi);)보다 여러 개의 작업이 필요할 때

-> 하나의 클래스를 앞에 new를 붙여 복제해서 각각의 다른 상태를 가지고 있는 인스턴스를 만들어 사용하는 것이 효율적이다.

:클래스가 긴 맥락을 가지고 작업을 해야 한다면 인스턴스를 사용하는 것이 효율적.

:constructor가 없으면 일회용이다. (인스턴스 x)

https://docs.oracle.com/javase/7/docs/api/ 에서 확인 가능하다.

(google search : api documentation java)

:constructor가 있으면 인스턴스를 만드는 것이 허용되어 있다. 

 

15. ingeritance (상속)

Ex)

java.lang.Object

        java.io.Writer

                java.io.PrintWriter

-> PrintWriter는 Writer를 상속받아 그 특징들을 물려받았지만 추가된 변수와 method들이 존재한다.

-> Writer는 Object를 상속받아 특징들을 물려받았으나 변수와 method들이 추가되었다.

 

[상속 관계 확인 방법]

PrintWriter -> Open Type hierarchy
우측 상단 : 상속 관계 보여줌
PrintWriter에서 toString을 쓸 수 있다. Writer-Object를 상속받았기 때문.

 

class Object

class Writer extends Object

-> Object를 extends에서 확장해서 writer class를 만들었다는 뜻

class PrintWriter extends Writer

-> writer class를 확장해서 상속받아서 만든 것.

 

 

728x90
반응형