01_프로그래밍 기초
프로그램(Program): 컴퓨터가 인식할 수 있는 명령어의 나열(집합) = 개발
프로그래밍(Programming): 프로그램 작성 과정 = 코딩
프로그래머(Programmer): 프로그램을 작성하는 사람 = 개발자
자바 언어 특징
1. 운영체제에 독립적(이식성이 높음) = 어느 운영체제(=플랫폼)에 깔아도 잘 구동됨
운영체제: 하드웨어를 구동시키기 위한 소프트웨어
2. 사용하기 쉬운 언어(포인터, 메모리)
- 다른 언어의 단점 보완
- 객체 지향 언어 = 부품을 따로따로 만든 후 완제품 조립
- 능률적이고 명확한 코드 작성 가능 = 기능 구현 외 성능 관련 코드를 따로 작성할 필요가 없음
3. 자동 메모리 관리(GC: Garbage Collection) = 내부 청소부(Garbage Collector)가 주기적으로 안 쓰는 메모리 정리해 줌
4. 네트워크(물리적 거리 상관없이 통신 가능)와 분산 환경 지원
5. 멀티쓰래드(프로그램 1개가 동시에 여러 일 가능) 지원
JVM(Java Virtual Machine): 자바를 실행하기 위한 가상 기계, 바이트 코드(class 파일, 1과0으로 이루어진 코드)을 해석하고 실행하는 interpreter(해석기, 실행기)
자바가 운영체제에 독립적일 수 있는 이유
Virtual이 붙으면 '소프트웨어'와 비슷한 개념이 됨
확장자: 어떤 종류의 파일인지 확인하게 해 줌
자바 실행 순서
1. 자바 코드 짜기(프로그래밍 하기) = 자연어
파일 단위: .java
2. 기계어(1,0으로만 이루어짐)로 바꾸기 = 컴파일 과정
파일 단위: .class
3. JVM에 의해 실행
자바 개발 환경
설치 범위: 사용자/개발자 입장에 따라 설치 범위가 달라짐
JVM: 자바 가상 기계(단순 실행 역할)
JRE: 자바 실행 환경(적어도 자바 실행에 필요한 조각조각 모음) = 사용자가 깔아야 하는 것!, JVM 포함
JDK: 자바 개발 도구 = 개발자가 깔아야 하는 것!, JRE 포함
자바 버전
Java SE: 일반적인 표준 자바 버전 = 설치해서 사용할 수 있는(응용 소프트웨어)만 사용할 수 있음
Java EE: 자바의 확장된 버전 = 일반 표준 버전 포함, 자바로 웹사이트 제작 가능
(학원에서는 JDK Java EE 8버전[공공기관에서 많이 사용, 가장 통용적이고 안정적] 설치함)
https://docs.aws.amazon.com/corretto/latest/corretto-8-ug/downloads-list.html
Windows 64, 32 차이: 메모리에 들어갈 수 있는 숫자
Windows 64 = 더 큼, 메모리 8GB
Windows 32 = 86이라고 표현하기도 함(메모리 4GB)
.msi: 실행 확장자이며, microsoft install의 약자! 이걸 설치함
설치 로케이션은 C:\Program Files\Amazon Corretto\
설치 버전 체크
1. 명령 프롬프트(or cmd) 실행
2. java -version 엔터(jdk 깔려 있는지 확인)
openjdk version "1.8.0_342" 뜨는 거 확인
3. javac -version 엔터(자바 컴파일러 버전 확인)
javac 1.8.0_342 뜨는 거 확인
⇒ 자바를 다 깔았습니다~! 하지만 이건 메모장에서도 가능한 상태... 간단한 문서 작업을 위한 프로그램과 같은 상태임
⇒ 가독성 떨어짐, 유지보수 힘듦
=> IDE가 필요함!
IDE(Integrated Development Environment): 통합 개발 환경 = 코드 작성을 위한 문서 편집기
ex: 이클립스(무료), 인텔리제이(유료)
프로그램 개발에 관련된 모든 작업을 할 수 있는 도구, 애플리케이션 구축을 위한 소프트웨어
보라색, 파란색, 빨간밑줄, 노란밑줄, ... => 코드 하이라이팅을 통한 가독성 최적화
이클립스 https://www.eclipse.org/downloads/
Downloads - Downloads Packages - MORE DOWNLOADS - 2020-03(깔았던 java와 가장 호환 잘되는 버전임)
- R Packages -
Eclipse IDE for Enterprise Java Developers (includes Incubating components) - Windows 버전 다운로드 - 알집 파일 이름 짧게 바꾸고 c드라이브에 파일 옮긴 후(혹시 모를 오류 방지) 압축 해제 - eclipse.exe - 보내기 - 바탕화면에 바로가기 만들기
eclipse.exe 실행
Workspace: 만들 프로그램을 담고 있는 최상위 폴더, 한글 안 됨, 언더 바 제외 특수기호와 띄어쓰기 웬만하면 넣지 말 것(경로 찾을 때 오류 날 수 있음, pc 이름도 한글 넣지 말기!)
기존 경로(C:\Users\user1\eclipse-workspace) 쓰지 말고! 새로운 경로(C:\01_Java-workspace) 만들어 주고 Workspace 설정
체크박스 체크하지 마시오!
강의 프로그램 바뀔 때마다 워크 스페이스 바꿔야 하기 때문에 뜨는 게 나음 - Launch - Welcome창 닫기
<이클립스 설정>
이클립스 워크 스페이스 지정하고 접속하면 폴더에 이거 생김(건드리지 말 것!)
=> 앞으로 내가 적용할 이클립스 세팅에 대한 내용이 담기는 파일임
Java EE: 확장된 기능 제공하는 버전
Java SE: 기본 버전
=> 초반에는 기본 버전 쓸 것임! 확장된 버전부터 쓰면 곁다리로 너무 보이는 게 많아서 처음에 헷갈릴까 봐
EE에서 SE로 바꾸는 법
이클립스 우측 상단 커피콩 모양의 Java EE 왼쪽의 Open Perspective 클릭 후 Java 클릭하면 끝
우측의 outline, ___ 삭제, 하단의 Javadoc, Declaration 삭제
=> 코딩창을 넓게 쓰기 위해서 필요하지 않은 탭 정리해 준 것임
Window - Show View에서 Console, Navigator 추가하고 Navigator탭은 좌측으로 이동
Console, Navigator: 앞으로 내가 만들 파일 구조를 보여 주는 기능
Console: 리스트 형식으로 보여 줌
Navigator: 윈도우즈 파일 탐색기처럼 보여 줌 (우리한테는 이게 편하겠죠?)
=> 필요한 위젯 추가
이러한 설정이 .metadata에 저장되는 것이고, 이클립스를 껐다 켜도 설정 유지됨!
<Eclipse 환경에서의 자바 프로그래밍 순서>
1. Project 만들기
Project = 프로그램에 필요한 모든 것들(소스 코드, 환경설정 및 기타 등등)의 파일 최상위 폴더 개념, 프로그램 단위
2. Package 만들기
package = 소스코드를 담을 수 있는 폴더(분류의 목적)
3. Class 만들기
class = 부품, 소스코드의 최소 단위이며 하나의 class가 하나의 .java 파일이 됨
1. 프로젝트 만들기
ⓐ 첫 번째, File - New - Java Project 선택
두 번째, 하기 캡처 참고(아무런 프로젝트가 없을 때만 사용 가능한 방법)
세 번째, Package explorer나 Navigator에서 오른쪽 마우스 버튼 누르고 New - Java Project 선택(폴더나 프로젝트 있을 때만 사용 가능)
ⓑ Project name 입력 후 Finish(나머지 설정은 기본값 그대로)
코드 작성법
(1) 코드 작성(.java)
(2) 컴파일러에 의해 기계어로 번역(.class)
(3) JVM에 의해서 실행
src: source의 약자 => 1단계(소스 코드 작성) 진행해야 하는 폴더
bin: binary(2진수)의 약자 => 내가 만든 소스코드가 컴파일된 파일들이 모여 있는 폴더
2. 패키지 만들기
(소스코드를 담으니 src 폴더에 만들어야 함)
ⓐ src 오른쪽 마우스 - New - Package 클릭
com 안에 폴더 또 만들고 싶다면?
=> package 안에 또 다른 package 만들 수 있고, 여러 개도 만들 수 있음!
=> 하지만 동일 package 내 같은 이름으로는 불가능
=> 기존패키지명.새로운패키지명 으로 만들 수 있음!
*com 폴더를 삭제하면 하위 폴더 모두 삭제됨!
**src 폴더에 아무것도 없는 상태에서 com.kh.first로 추가하면 한 큐에 3가지 폴더 모두 포함 관계로 만들어짐
*패키지 생성 시 주의사항
1. 한 패키지 내에 동일한 이름의 패키지 중복 불가
2. 패키지명은 항상 소문자로 적어야
=> 패키지는 항상 소문자, 클래스명 앞글자는 항상 대문자이므로 쉽게 구분할 수 있게 하기 위함
3. 기본 패키지(즉 src 폴더에) 클래스를 만드는 게 가능은 하지만 권장되지는 않음 => 위치 찾기 힘들어져서
4. 한 패키지 내에 동일한 이름의 클래스 중복 불가
5. 서로 다른 패키지 내에 동일한 이름의 클래스는 존재 가능
*패키지 생성 시 권장사항
1. 패키지는 적어도 세 단계 이상으로 만들어 줄 것
2. 두 번째 레벨까지는 회사 도메인 (손쉽게 웹사이트에 접속할 수 있는 고유한 주소) 의 역순으로 쓸 것
ex) www.google.com => com.google
www.naver.com => com.naver
www.kh.com => com.kh
왜? 도메인은 고유한 주소값이기 때문에 중복을 방지, 패키지만 봐도 어디서 제작한 프로젝트인지 파악 가능
* 1,2의 이유 => Spring Framework에서 지어낸 규칙이기 때문
3. 클래스 만들기
ⓐ 클래스 만들기를 원하는 package 폴더 마우스 오른쪽 버튼 - New - Class
ⓑ 클래스 위치 확인 후 이름 만들기
이클립스 코딩창 글자 크기: ctrl + +, -(키보드 자판 위에 있는 숫자 옆 +와 -)
주석: 소스코드로 인식되지 않음, 설명용이며 슬래시 두 번은 한 줄짜리 주석 //, 여러 줄짜리 주석 /*
클래스의 구조
package com.kh.first; // 패키지 선언부: 클래스 생성 시 선택한 패키지의 위치를 알려 주는 구문, 삭제하면 안 됨
// 클래스 선언부
// 이 클래스의 풀 네임: com.kh.first.HelloEveryone
// 패키지의 이름은 항상 소문자, 클래스명의 앞글자는 항상 대문자로 씀으로써 쉽게 구분할 수 있게 함
public class HelloEveryone { // HelloEveryone 클래스 영역 시작
// 내가 작성하고 싶은 코드를 적는 부분
// 단, 소스코드는 클래스 안에 바로 작성 불가능하고, 메소드 안에 작성해야 함
// 메소드 만들기
//일반 메소드의 기본 표현법
/*
public void 메소드명() {
}
*/
// main 메소드의 기본 표현법 (고유명사)
public static void main(String[] args) { // main 메소드 영역 시작
/*
* * Method: 사전적인 정의로 "기능"을 의미함
* 하나의 기능 단위
*
* * Method 특징
* 1. 메소드는 일반 메소드와 main 메소드로 나뉨(main 메소드이거나 main 메소드가 아니거나)
* => main 메소드: 내가 만든 프로그램의 시작점을 나타내는 메소드
* JVM에 의해 실행됨
* => 일반 메소드: 내가 만들고 싶은 기능 단위별로 만들면 됨
* main 메소드이든 일반 메소드이든 간에 다른 메소드에서 실행시켜 줘야 함
* - 메소드를 실행시키는 것을 "호출(call)" 이라고 한다!!
* 2. 하나의 클래스 안에 여러 개의 메소드 존재 가능
* 단, 주의할 점! 표면적으로는 메소드명이 중복될 수 없으나
* => 특별한 규칙 (오버로딩) 에 의해서 메소드명이 중복될 수 있음!!
*/
// 코드 작성 부분
// 코드 작성 시 주의사항: 항상 코드 한 줄씩 세미콜론 (;) 을 붙여 줘야 함 => 마침표의 역할
// 출력문(출력 메소드)
// System.out.println(내용물); : 내용물을 출력 후 줄바꿈(개행)이 일어남, ln = line의 줄임말
System.out.println("Hi everyone!"); // 해당 값을 출력해 주는 구문
System.out.println("안녕하세요");
// System.out.print(내용물); : 내용물을 그냥 출력만 하는 역할
System.out.print("여\n러\n분\n~!\n"); // \n: 개행 문자(줄바꿈을 해 주는 특수한 역할의 문자), 출력물 중간에 들어가도 됨
System.out.print("반갑습니다^^");
// System.out.printf(내용물); : 내용물을 지정된 형식에 맞게 출력해 주는 역할
/*
* 프로그램의 기본 흐름은 위에서 아래 순서대로 실행된다!!
* main 메소드 기준으로 위에서부터 아래 순서대로 순차적으로 출력문이 console에 찍힘
*
* main 메소드는 프로그램의 시작점
* => 프로그램당 main 메소드는 적어도 1개씩 가지고 있어야 함
* => 프로그램당 main 메소드는 여러 개 존재 가능
* => main 메소드는 일반 메소드와 동일하게 다른 메소드에서도 호출 가능
*/
} // main 메소드 영역 끝
} // HelloEveryone 클래스 영역 끝
/*
* * 자바의 명명 규칙 (이름을 붙이는 규칙)
* => 웬만해서는 지키자 (개발자들 간의 코딩 규칙 = 코딩 컨벤션)
* 1. 영어 사용(다른 언어는 컴퓨터 환경에 따라 깨지는 경우 있음)
* 2. 띄어쓰기 불가
* 3. 의미를 부여해서 여러 단어를 조합해서 짓는다
* ex) HelloEveryone
* 4. Package명은 소문자로 짓는다(클래스와 구분하려고)
* 5. Class명의 첫 글자는 대문자로 시작한다
* 6. Method명의 첫 글자는 소문자로 시작한다
* 7. 변수명의 첫 글자는 소문자로 시작한다
* 8. 공통 원칙: 여러 개의 단어를 조합해서 이름을 지을 때는
* 띄어쓰기 대신 각 단어별로 첫 글자를 대문자로 표현한다 => "낙타표기법 (Camel case)": 가독성을 위한 표기법
* ex) 클래스명: helloeveryone -> HelloEveryone
* ex) 메소드명: sayhello -> sayHello
*/
* 자바의 명명 규칙 (이름을 붙이는 규칙)
=> 웬만해서는 지키자 (개발자들 간의 코딩 규칙 = 코딩 컨벤션)
1. 영어 사용(다른 언어는 컴퓨터 환경에 따라 깨지는 경우 있음)
2. 띄어쓰기 불가
3. 의미를 부여해서 여러 단어를 조합해서 짓는다
ex) HelloEveryone
4. Package명은 소문자로 짓는다(클래스와 구분하려고) (패소)
5. Class명의 첫 글자는 대문자로 시작한다 (첫클대)
6. Method명의 첫 글자는 소문자로 시작한다 (첫메소)
7. 변수명의 첫 글자는 소문자로 시작한다 (첫변소)
Public: 공개됨, 다른 클래스에서 이 메소드를 호출할 수 있음
static: 언제든지 실행할 준비가 되어 있음(사용자가 실행을 위해 클릭했을 때 바로 실행되어야 하기 때문에 메인 메소드에는 이게 붙음)
void: 실행만 될 뿐 결과물이 보이지 않음
Method: 사전적인 정의로 "기능"을 의미함
하나의 기능 단위
* Method 특징
1. 메소드는 일반 메소드와 main 메소드로 나뉨(main 메소드이거나 main 메소드가 아니거나)
=> main 메소드: 내가 만든 프로그램의 시작점을 나타내는 메소드
JVM에 의해 실행됨
=> 일반 메소드(main 외 모든 메소드): 내가 만들고 싶은 기능 단위별로 만들면 됨
main 메소드이든 일반 메소드이든 간에 다른 메소드에서 실행시켜 줘야 함
- 메소드를 실행시키는 것을 "호출(call)" 이라고 한다!!
2. 하나의 클래스 안에 여러 개의 메소드 존재 가능
단, 주의할 점! 표면적으로는 메소드명이 중복될 수 없으나
=> 특별한 규칙 (오버로딩) 에 의해서 메소드명이 중복될 수 있음!!
3. 메소드 안에 메소드가 존재할 수 없음
*메소드 호출
1. 호출하고자 하는 메소드가 같은 클래스 내에 있을 때는 메소드명(); 으로 호출
2. 호출하고자 하는 메소드가 같은 패키지 내에 있을 때는 클래스명 대변할이름 = new 클래스명(); 으로 호출
3. 호출하고자 하는 메소드가 다른 패키지에 있을 때는
(3-1) 패키지 선언부와 클래스 선언부 사이에 import 최상위패키지.하위패키지.클래스이름 ; 적은 후
=> 호출하고자 하는 메소드가 있는 위치를 불러와 줌
(3-2) 클래스명 대변할이름 = new 클래스명();
대변할이름.메소드명(); 으로 호출
프로그래밍 순서
Project - Package - Class - Method(=함수, main-시작점/1개 이상/여러 개 가능/JVM이나 다른 메소드가 실행, 일반-나를 호출해야 실행 가능/실행 뒤 나를 호출했던 곳으로 되돌아감)