Programming/Java

[ JAVA 수업 DAY 01 ] Java 기초

빠모스 2020. 4. 12. 02:15
반응형

0. 디렉토리 만들기

자바와 이클립스를 설치하면 기본적으로 두개의 폴더가 생긴다.

  • bin : 버전관리 및 src에 저장된 .java로 이루어진 소스파일이 컴파일되어 .class 파일로 저장되는 곳
  • src : 소스코드 파일이 저장되는 곳

 

1. 자바언어의 특징

 

90년대부터 자바언어가 인기 많아졌다고 한다. 그 전까진 C나 C++이 한국에서 더 많이 쓰였는데, 인터넷망이 다 깔리며 자바가 많이 쓰이기 시작했다. 지금은 자바를 모르면 웹수업을 못한다.

  • WORA : Write Once Run Anywhere - OS에 독립적인 언어를 뜻한다. C는 윈도우에서 만든 코드가 유닉스나 리눅스에서 실행이 안된다. 각 OS마다 개별의 C언어가 생기게 된다. 자바는 WORA 언어이다.
  • 컴파일 + 인터프리터 : OS에 독립적인 형태가 되기 위한 자바의 가장 큰 특징이다. 우리가 쓰는 10진수를 컴퓨터가 이해할 수 있도록 이진수로 통역해준다. 초반에는 인터프리터만 있었지만, 보안문제가 있어서 컴파일러라는 명령어 해석기가 나타나게 되었다. 요즘은 특징에 따라 컴파일러를 쓰기도, 인터프리터를 쓰기도 한다. 자바는 컴파일러와 인터프리터를 같이 쓴다. 파이썬은 인터프리터만, 씨는 컴파일러만 있다. 사용자가 hello.java 만드는 순간 bytecode로 된 hello.class 파일이 생성되고 실제로 외부에 공유할땐 이 class파일을 공유하는 것이다. JVM은 이 class를 운영체제에 따라 실행한다. 

  • jre : = jvm. 하지만 우린 개발 환경까지 구성해야하기 때문에 jdk를 설치해서 모두 구축해야 한다. (맥은 해당사항 없음)
  • 외부에 .java파일을 주게 되면 소스코드를 수정할 수 있기 때문에 보안에 취약하고, 보통 .class 파일로 공유한다. 
  • 자바의 가장 큰 장점은 메모리 관리(Garbage Collection)이다. 프로그래밍을 하다보면 메모리 누수가 되서 재시동되기도 한다. 근데 자바는 개발자가 아니라 JVM 자체가 알아서 메모리를 관리해준다. JVM은 그래서 쓰레기 수집가(Garbage Collector)라고도 한다. 하지만 쓰레기 수집가를 개발자가 제어할수는 없다. gc() 명령어가 있긴 하지만 쓰레기 수집가, 출동해! 라고 명령하는 것이 아니다. close()와 같은 명령어들이 사실 메모리와 관련된 명령어다.

 

2. 메인 메소드

public static void main(String [] args) { }

//=> 자바에선 무조건 위같은 고정된 형태로 하고, 대문자 소문자를 구분해야 한다.

static public void main(String [] args) { } 

//=> public과 static의 위치가 바껴도 괜찮다.

public static void main(String args[]) { }

public static void main(String [] aaa) { }

//=> 이들도 가능. 하지만 대부분 다 첫줄 형태로 고정해서 쓴다.

 

3. 출력문

  • print
  • println
  • printf

=> 옛날에는 printf가 C언어에서 따왔다고 자바리안들이 싫어했다고 한다. 지금은 워낙 오래되서 많이 섞어 쓴다.

 

System.out.println(“aaa” + “bbb”);

//이런식으로 짜게되면 사실 컴퓨터 메모리와 속도에 좋지 않음.

 

  • println은 개행문자(\n)을 포함한다. ‘line feed(라인피드)’ 라고 한다.

사실 (3, 12)에 있던 커서가 line feed가 되면 (4, 12)가 되야되는데 실제 println은 (4,1)로 간다. 이때 3에서 4로 행이 바뀌는건 line feed이지만, (4, 12)에서 (4, 1)로 첫번째 문자로 가는건 carriage return이라고 한다. 즉, 개행문자 \n은 line feed + carriage return인 것.

 

 

  • 출력 버퍼 / 입력 버퍼 : 좀 더 빠른 속도로 출력하기 위한 쌀독의 ‘되’와 같은 개념.

keyboard -> RAM -> monitor (키보드에서 입력받고 RAM에서 처리되어 monitor에 출력된다.)

“abc”를 출력해줘! 라고 하면 버퍼에 a, b, c가 차곡차곡 쌓이고 한번에 출력하라 했으니 한번에 출력한다. 이 때 쌀을 한톨씩, a 출력하고 b 출력하고 c 출력하고 하는것보다 효율적이다. println은 입력버퍼에 \n 개행문자까지 들어가는 것이다.

 

  • 컴퓨터에서 상수의 종류 : 
    1. 정수    byte  short  int  long
    2. 실수    float  double
    3. 문자    char
    4. 문자열  String
    5. 논리값(얘는 자바만 있다)  boolean
// 자바에서는 문자열 + 다른 형태를 같이 출력하게 되면 모두 문자열로 바뀐다.
// ex)
System.out.print(10 + “  ABC”) => “10  ABC”가 됨.

// 모두 문자열이 되는걸 막기 위해 printf가 있다.
System.out.printf(“%d  %s”, 10, “ABC”);

 

이클립스 실습

java 프로젝트를 만들면 src, bin이라는 폴더가 생긴다.

.java 파일들은 src에, .class 파일들은 bin에 들어간다.

몇몇 사람들은 bin 대신 classes로 만들기도 한다.

 

패키지

자바에서는 예를들어 A.java라는 파일이 세개일때 구분을하기 위해 패키지를 사용한다. 특히 대형 프로젝트를 할 때 지문인식만 하는 회사, 보안만 하는 회사 등이 클래스 이름이 같게 만들 순 있지만, 패키지는 다르게 해서 이름이 동일한 클래스도 다른 클래스로 인식할 수 있도록 한다. 패키지 이름은 대부분 회사의 도메인으로 한다. ex) kr.co.hana

 

클래스 

클래스 이름은 반드시 대문자로 시작하고, 카멜표기법에 따라 새로운 단어가 오면 대문자로 다시 시작한다. 

메인 클래스는 HelloMain 식으로 Main이라고 붙여주는게 좋다.

 

Cf) 자바에서 문자를 표현하는 방법

  • ascii 코드 : 소분자, 대문자, 숫자문자, 특수문자, 공백문자 = 1byte(256가지, 8bit)
  • 유니코드(ascii 코드 + 한글, 한자 …) = 2byte(65000, 16bit)

=> c는 ascii, 자바는 유니코드로 문자를 표현. 

‘A’ ==> 65 (ascii) ==> ‘\u0041’ (유니코드. u는 유니코드 쓰겠다는 것, 0041은 16비트)

그래서 자바는 유니코드 기반이기 때문에 작은따옴표로 한글 문자 표현 가능. ‘가’. C에선 “가”.

 

클래스의 구조

  • 객체지향 방법론 : 프로그램의 일부만 수정하고 싶을 때 상속, 추상클래스같은 애들이 나타나기 시작했다. 이런 객체지향 방법론은 클래스 기반으로 움직인다.
  • 자바 이전에는 C++같은 객체지향이 있지만 반만 객체지향이다. 
  • 객체지향으로 사용하지 않아도 프로그램 실행 가능하지만, 자바는 반드시 객체지향만 가능하다. 

클래스 선언부에 올 수 있는 것

  • 주석문
  • 패키지
  • 임포트
  • 클래스 선언

클래스 내용부에 올 수 있는 것

  • 멤버변수
  • 메소드
  • 내부클래스
// [클래스 선언부]
// /* */
package kr.co.mlec;

class SubHello {

}

class Hello {

	// [클래스 내용부]
	int num;
	void main() {}
	class InnerHello {

	}
}

 

 

자바의 자료형

  • 기본 자료형 : 소문자로 시작
  • 논리형 : boolean
  • 문자형 : char
  • 숫자형 
    • 정수형 (int가 기본) : byte, short, int, long
    • 실수형 (double이 기본) : float, double
  • 참조 자료형 : 대문자로 시작, 기본 자료형 8가지 외 모든 것)

cf) boolean의 경우 T/F 두 가지의 경우만 필요하므로 크기가 1bit이지만 컴퓨터의 기본 메모리 단위가 byte기 때문에 1비트만 써도 잡힐땐 1바이트로 잡힌다.

 

변수

  • 참조 변수의 경우, 예를들어 String의 경우, 얼마나 긴 문자열을 입력할지 모르기 때문에 참조 변수에 값을 대입할 때 값이 그대로 저장되는게 아니라 우선 그 값을 저장할만한 공간을 따로 만들어서 변수는 그 공간의 위치를 저장한다. => 메모리를 효율적으로 이용 가능하다. 
  • 해당 변수는 해당 값을 가지고있는게 아니라 남이 저장한 그 값이 저장된 주소를 갖고있기 때문에 “참조한다”고 표현하고, 그렇기 때문에 참조변수라고 한다.
  • 기본형 변수와 참조변수가 저장되는 공간은 아예 다르다.
  • 참조 자료형은 여러개의 변수가 하나의 저장공간을 참조할 수 있지만, 기본 자료형은 값이 동일하더라도, 다른 공간에 개별적으로 가지고 있게 된다.
// 기본형 변수
int a = 30;
int a2 = 30; // => 두 개의 공간에 30이 따로 저장
// 참조형 변수
String b = “AB”;
String c = “AB”; // => 한 개의 공간에 AB가 저장된 주소를 공유

 

형변환

연산자를 기준으로 왼쪽과 오른쪽의 데이터 타입이 서로 다른 경우, 형변환이 일어난다.

 

ex) 3 + 4 => 왼쪽 오른쪽 모두 정수형이라 형변환이 일어나지 않는다.

ex) 3 + 4.4 => int + double로 인식하여 둘 중 더 큰 수의 형을 따라가게 된다. 즉, double + double로 인식하는 형변환이 일어난다. ==> “묵시적 형변환”

 

[묵시적 형변환] ===================>

byte < short < int < long < float < double

<====================[강제적 형변환]

 

형변환을 위해서는, 변환하려는 형태를 값 앞에 써준다.

(double) 3 + 4.4

근데, 이 double을 생략할 수 있으면 묵시적 형변환, 아니면 강제적 형변환이다.

double b = 10; // => 묵시적 형변환

int a = (int)10.3; // => 강제적 형변환

 

CF) 자바는 코드를 치는 순간부터 컴파일을 하기 때문에 바로바로 에러를 보낸다.

에러는 위에서부터 잡아야 한다.

 

CF) /**

      */

=> 도큐먼트 주석

 

< 이클립스 단축키들 - 맥 >

cmd + n ==> 새로운 뭔가를 생성 

cmd + m ==> 전체화면 토글

main 작성 후 ctrl + space => main() 메소드 자동완성

cmd + shift + F11 + fn => 프로그램 실행

sysout + ctrl + space => System.out.println() 메소드 자동완성

cmd + f2 => 패키지나 클래스 이름 변경

cmd 누른채로 메소드에 마우스 클릭하면 자바 소스코드 볼 수 있다.

ctrl + shift + o => 자동 임포트

ctrl + cmd + / : 범위 주석

ctrl + cmd + \ : 범위 주석 해제 

cmd + / : 한줄 주석

cmd + alt + 아래화살표 => 라인 복사

alt + 화살표 => 문장 이동

 

실습 코드

https://github.com/LeenaKim/Java_Lessons/tree/master/src/kr/ac/kopo/day01

 

LeenaKim/Java_Lessons

A record of Java lessons that I'm currently taking / 자바 수업시간 배운 내용들과 과제를 저장하는 저장소입니다. - LeenaKim/Java_Lessons

github.com

 

반응형