Til (60)

 

 

배열

 

 

1차원 배열

 

같은 자료형이 여러개 연속될 때 배열로 쉽게 관리할 수 있음

인덱스는 항상 0부터 시작됨

선언 : 자료형[] 변수명 = new 자료형[개수];

배열을 선언할 때는 크기(개수)를 지정해줘야함!

크기를 지정안하고 넣는만큼 크기가 지정되는 배열을 쓰고 싶다면 ArrayList를 사용하면 된다.

 

 

여러가지 배열 선언하는 방법

 

// 배열을 선언하면 '= new 자료형[요소 개수]' 을 해줘야함
int[] arr = new int[5];

// 중괄호{} 안에 요소를 전부 작성해주면 요소 개수는 생략할 수 있다
int[] arr2 = new int[]{1, 2, 3, 4, 5};

// 바로 요소 중괄호에 넣어주면 이렇게 줄여쓸 수도 있다
int[] arr3 = {1, 2, 3, 4, 5};

// 선언하면서 초기화해도 되지만 이렇게 선언하고 나중에 new int[]라고 작성해줘도 된다
// 그런데 이때는 new int[] 생략하면 안된다
int[] arr4;
arr4 = new int[5];

// 이것도 당연히 된다
int[] arr5;
arr5 = new int[]{1, 2, 3, 4, 5};

 

 

배열은 기본타입 변수가 아니고 참조타입 변수이기 때문에

변수 안에 값을 가지고 있는것이 아니라 실제로 배열의 요소 값들이 저장되 있는 주소를 가지고 있다

왜 주소값을 갖고 있는가?

기본타입은 선언할 때 메모리를 얼마나 할당할지 정해진다.

예를 들어 int는 4byte, char는 2byte 이렇게 메모리 공간이 정해져 있어서 어떤 값을 넣든

선언한 타입의 사이즈에 맞게 메모리 크기를 정하는데

배열은 메모리를 얼마나 할당해야하는지가 매번 다르다.

이러면 선언할 때마다 할당해야하는 크기를 알 수 없기 때문에 변수에는 주소값만 가지고 있고 값은 해당하는 주소에 차례대로 넣는게 효율적이다.

 

 

인덱스 연산자

 

배열의 구조

 

배열의 인덱스는 언제나 0부터 시작

배열에서 인덱스에 접근하려면

변수명[인덱스] = 넣을 값;

여러개의 인덱스에 한 번에 값을 넣고 싶으면 for문 사용하면 됨

 

배열의 길이

배열에 기본적으로 있는 메소드 length를 사용하면 길이 정수 값으로 가질 수 있음

주의 ⚠️) String의 길이를 구할 때는 괄호()를 쓰지만 배열의 길이는 뒤에 괄호를 쓰면 오류남!

int[] arr = {2, 4, 6, 8, 10};
System.out.println(arr.lenghth);	// '5' 출력됨
System.out.println(arr.length());	// ERROR!

 

배열의 인덱스는 0부터 시작 → 마지막 인덱스에 +1 한 값이 배열의 길이 (length)

배열의 길이는 0부터 시작 (데이터 저장 못함)

// 길이 0인 배열 만들기
int[] arr = new int[0];
int[] arr = new int[]{};

 

 

배열의 요소를 toString으로 출력하기

 

Arrays 클래스가 가지고 있는 toString 메소드를 이용하면 배열의 목록을 쉽게 출력할 수 있다.

이때 Arrays로 불러오는지 배열이름으로 불러오는지에 따라 값이 다르게 나온다.

 

int[] arr = {1, 3, 5, 7, 9};

System.out.println(Arrays.toString(arr));		// [1, 3, 5, 7, 9] 출력

System.out.println(arr.toString());			// 주소값 출력

 

<출력결과>

[1, 3, 5, 7, 9]
[I@6979e8cb

 

'Arrays.toString(배열이름)' 을 사용하면 [ ] 안에 요소를 순서대로 출력할 수 있다.

'배열이름.toString()' 을 사용하면 주소 값이 문자열 형태로 출력된다.

 

 

다차원 배열

 

배열 안에 배열이 중첩되있는 모양

다차원 배열에는 2차원, 3차원 배열 등이 있음

2차원 이상 배열을 선언하는 규칙은 1차원 배열을 선언하는 규칙과 똑같음

 

 

2차원 배열

 

2차원 배열의 구조

 

 

2차원 배열을 출력하려고 Arrays.toString을 사용하게 되면

// 2차원 배열 선언
int[][] dimension = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};

// Arrays.toString 으로 출력해보기
System.out.println(Arrays.toString(dimension));

 

  <출력값>

[[I@26f67b76, [I@153f5a29, [I@7f560810]

??

출력값이 주소값으로 나온다.

왜냐하면 다차원 배열은 배열안에 배열이 있는 구조이기 때문이다.

 

Solution

 

1. 반복문 사용하기

for 문으로 배열 값을 하나씩 출력해주는 방법도 있다.

이 방법은 쉽지만 for 문을 2중으로 중첩해야 해서 좀 귀찮은 방법이다.

 

2. deepToString() 메소드 이용하기

java.util.Arrays 안에 있는 deepToString()메소드를 사용하면 다차원 배열을 쉽게 출력할 수 있다.

System.out.println(Arrays.deepToString(dimension));

<출력값>

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

 

 

가변 배열

 

2차원 이상의 다차원 배열에서는 1차원 배열과는 다르게 배열의 공간을 자유롭게 만들 수 있다.

다차원 배열은 배열안에 배열이 들어가있는 형태이다.

따라서 배열의 마지막 차수의 크기를 지정하지 않고, 크기가 다 다르게 지정되게끔 만들 수 있다.

 

int[][] var = new int[10][];	// 배열의 열부분 크기 지정 안하면 가변배열

마지막 차수의 크기를 비워놓고 배열안의 배열의 크기를 각각 다르게 배열을 넣어주면

각각 크기가 다르게 생성된다.

 

 

 

배열의 복사

 

배열을 복사하는 방법 중에 가장 

배열을 복사하고자 할 떄는 System.arraycopy() 메소드를 사용 

System.arraycopy(src, srcPos, dest, destPos, length)

→ 매개변수 순서대로 복사할 배열, 복사 시작할 인덱스, 붙여넣을 배열, 붙여넣기 시작할 인덱스, 복사할 배열의 길이

 

int[] arr1 = new int[] {1, 2, 3, 4, 5};
int[] arr2 = new int[arr1.length];

// System.arraycopy를 이용한 복사
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));

 

<출력 결과>

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

 

 

 

 

조건문

 

조건이 참이면 실행

 

if 문

 

if (조건식) {

     실행문;

}

 

  • 참이나 거짓으로 판별할 수 있는 식을 ‘조건식’ 안에 넣어주고
  • 참이면 중괄호 안의 코드를 실행
  • 블록(block) : 중괄호를 이용해 문장을 하나의 단위로 묶은 것

 

if else

  • else 는 말 그대로 그렇지 아니면...
  • if 문의 조건식이 false라서 실행문을 실행하지 않았을 때 밑에 else if / else 로 이어서 작성할 수 있음

 

 

 

Switch문

 

변수가 어떤 값을 갖느냐에 따라 실행문이 선택됨

변수의 값에 따라 실행문 다르게 할 때 if문 보다 코드 간결

 

 

switch (변수) {
	case 1:
		실행문;
		break;
	case 2:
		실행문;
		break;
	...

}

 

동일한 값을 갖는 case로 가서 실행

동일한 값이 없으면 default로 가서 실행(default는 생략 가능)

case 마다 break문을 작성하지 않으면 모든 case에 있는 실행문을 실행 (fall through)

해당 실행문만 실행시키려면 실행문 끝에 break문을 써줘야함

switch의 변수에는 int, char 뿐 아니라 java 7부터 String 타입도 가능

 

 

참고) 향상된 switch문

  • java 14부터 향상된 switch문(enhanced switch문) 생김
  • 여러 조건에 따라 , 로 구분하여 한번에 묶을수 있음
  • ' : ' 대신에 ' -> ' 사용(람다 스타일), break문 생략
  • ' -> ' 사용하고 실행문이 2개 이상이면 중괄호{}로 묶음
switch (day) {
	case Monday, Tuesday -> System.out.println("피곤");
    case Wednesday, Thursday -> System.out.println("🐶 피곤");
    case Friday -> {System.out.println("🔥 금");
    				nextDay = sat;
                    }                
}

 

 

 

 

반복문

 

반복횟수를 알고 있을 떄는 for문, 조건에 따라 반복할 때는 while문 주로 사용

 

for문

조건식이 참인 동안 반복

 

for(초기화; 조건식; 증감식) {

반복문;

}

초기화 변수는 주로 i(iterator, 반복계수)를 많이 사용

 

향상된 for문(enhanced for)

배열이나 객체에서 항목 개수만큼 반복할 때 주로 사용

for(변수 : 배열){

반복문;

}

 

 

while문

조건식이 true인 동안 계속 반복

 

while (조건식) {

반복문;

}

 

for문의 증감식이 필요하면 반복문 밑에 넣어주면 됨

또는 조건문

 

 

do-while문

 

do {

실행문

}
while(조건식);

실행문을 조건식을 확인하기 전에 한번 실행

 

 

 

break문

break문은 제어문에서 흐름을 나갈 떄 사용

주로 반복문 내에 if 문 넣어서 사용

break만 있을 경우 제일 가까운 반복문만 종료, 바깥쪽 반복문은 이어서 진행

빠져나가고 싶은 반복문이 있으면 해당 문법 앞에 라벨 붙이면됨

ex) Outer : for()

 

 

 

continue문

반복문의 조건식으로 이동하여 진행

주로 반복문 내에 if문 넣어서 사용

 

 

※ 그 외

 

String.format()은 반환형이 String 타입이기 때문에 String형 변수에 바로 대입해줄 수 있음

 

IntelliJ 단축키

debug : Ctrl + Alt + D

자동 줄정렬 : Cmd + Alt + L

 

랜덤 함수

Math.random()

double형으로 0.0이상 1.0 미만 사이의 값을 반환하는 함수

난수를 만들고 싶을 때 자주 사용

 

두 수 중 큰 수/작은 수를 찾는 함수

Math.max(int a, int b)

Math.min(int a, int b)

double, float, long형도 가능

 

 

'TIL(Today I Learned)' 카테고리의 다른 글

5/10 (화) 객체지향 프로그래밍 기초  (0) 2022.05.11
5/9 (월) 자바 배열 / 계산기 만들기  (0) 2022.05.09
5/4 (수) JAVA 기초  (0) 2022.05.05
5/3 (화) Git 기초  (0) 2022.05.04
5/2 (월) Linux 기초2  (0) 2022.05.03

 

JAVA란?

 

1996년에 나온 객체 지향 프로그래밍 언어(Object Oriented Programming, OOP)

운영체제에 독립적으로 실행 가능 → 다양한 운영체제가 공존하는 웹 환경에 적합한 언어로 지금도 전세계적으로 많이 쓰이는 언어

‘Write Once, Run Anywhere’ 슬로건으로 빠르게 많은 사용자 확보함

 

 

자바의 특징

 

운영체제에 독립적

객체지향언어 (OOP)

함수형 프로그래밍 지원

자동 메모리 관리(Garbage Collection)

 

 

 

JVM과 JDK

 

JVM (Java Virtual Machine)

 

  • 자바 프로그램을 실행시키는 도구
  • JRE(Java Runtime Environment, 자바 실행 환경)이나 JDK(Java Development kit, 자바 개발 키트)를 설치하면 자동으로 설치
  • 자바가 운영체제에 독립적인 건 JVM 때문에 가능
  • 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램
  • JVM을 거치기 때문에 자바는 C/C++ 보다는 속도가 느린 편 이지만 JVM 내부의 최적화된 JIT(just-in-time) 컴파일러를 통해 속도를 크게 개선

 

참고) JIT(Just-int-tim) 컴파일 이란?

동적 번역(dynamic translation)이라고도 함

프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법

컴퓨터 프로그램을 만드는 방법은 크게 두가지 (인터프리트 방식과 정적 컴파일 방식)

인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행

정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역

JIT 컴파일러는 두가지 방식을 혼합한 방식, 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러번 불릴 때 매번 기계어 코드를 생성하는 것을 방지

 

 

JDK (Java Development Kit)

 

JRE : JVM + 표준 클래스 라이브러리

JDK : JRE + 개발에 필요한 도구

JDK는 OracleJDK와 OpenJDK 가 있음

 

 

 

클래스(class)

 

자바는 객체 지향 언어이기 때문에 모든 코드는 클래스 내에 작성

클래스는 쉽게 말하면 객체를 찍어낼 수 있는 툴

 

 

main 메서드

 

메서드란? 클래스 내부에 정의된 함수

자바로 만든 프로그램은 실행 시 main 메소드를 가장 먼저 실행

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

 

 

 

자바의 접근 제어자(Access Modifier)

 

public > protected > default > private

 

public : 모든 접근 허용

protected : 같은 패키지(폴더)에 있는 객체와 상속 관계의 객체들만 접근 가능

default : 같은 패키지(폴더)에 있는 객체들만 접근 가능

private : 같은 클래스 내에서만 접근 가능

 

 

static

 

메소드가 객체마다 속한 것이 아닌 클래스 자체에 속한 것임을 지정하는 키워드

 

 

return과 void

 

자바의 메소드는 리턴 값의 타입을 명시해줘야함

return 값이 없을 경우 return을 생략하거나 return만 쓰거나 아무것도 없다는 의미에서 return void 키워드 사용

 

 

 

자바의 타입(Type)

 

기본 타입(primitive type)

 

  • 데이터의 실제 값을 의미함
  • 정수 타입, 실수 타입, 문자 타입, 논리 타입

 

 

참조 타입(reference type)

 

  • 데이터가 저장된 주소값을 담고있음
  • 기본형을 제외한 나머지 타입

 

 

정수 타입 (Integer Type)

 

맨 앞은 부호 비트이고 나머지 비트에 숫자를 이진수로 표현함

ex) 1byte에 맨 앞을 제외한 7bit 를 이용해서 나타낼 수 있는 숫자는 2^7 (256) 개

      양수와 음수를 모두 표현해야 하므로 양수 0~127(128개) + 음수 -1 ~ -128(128개) 까지 표현 가능

 

타입 메모리 범위 기타
byte 1byte -128(-2^7) ~ 127(2^7 - 1) 1byte = 8bit
short 2byte -32,768(-2^15) ~ 32,767(2^15 - 1)  
int 4byte -2,147,483,648(-2 ^31) ~
2,147,483,647(2^
31 - 1)
integer(정수)의 약자
기본적으로 정수는 int형을 사용
long 8byte -9,223,372,036,854,775,808(-2^63) ~
9,223,372,036,854,775,807(2^
63 - 1)
변수에 값 할당할 때 long 형이라고 컴퓨터에 알려주기 위해서 값 뒤에 L이나 l을 붙여야함(안 붙이면 오류!)

 

 

 

실수 타입

 

float와 double

 

  • float : 4byte
  • double : 8byte

 

실수형 값 뒤에 float 형이면 F 또는 f , double 형이면 d를 붙여야 하지만 double은 실수 기본형이기 때문에 d 생략 가능

자바는 실수형을 저장할 때 부동소수점 표현방식 사용 → 소수점을 더 정밀하게 표현할 수록 오차 줄어듬

 

 

논리 타입

 

boolean형

true 또는 false 값만 가질 수 있음

JVM이 다룰 수 있는 데이터 최소 단위가 1byte 이기 때문에 boolean 형은 1byte 차지

 

 

 

문자 타입

 

char형(character)

단 하나의 문자만을 저장할 수 있음

자바는 유니코드에 기반하여 문자를 표현하기 때문에 하나의 유니코드를 저장 (2byte)

문자를 변수에 저장하면 문자에 해당하는 유니코드 값이 저장됨

변수 값은 유니코드 값으로 저장해도 되고 'A' 처럼 작은 따옴표 안에 문자 직접 넣어서 저장할 수도 있음

 

 

※ char형 정수형으로 변환하기

// char형의 숫자를 int형으로 변환하는 방법
char ch1 = '9';
int temp = ch1 - '0'; // 57 - 48 = 9

 

int형을 char로 변환할 때는 반대로 + '0' 해주면 됨

 

 

 

String

 

String은 문자열을 저장할 수 있는 클래스

참조 타입

String = " "

큰따옴표 안에 저장할 문자열 입력

 

 

String 타입을 선언하고 저장하는 여러가지 방법

 

String str1;
str1 = "문자열";	// 문자열 리터럴을 대입하는 방식

String str2 = "문자열";	// 문자열 초기화

String str3 = new String("문자열");	// new 연산자를 사용해서 객체를 생성 후 대입

System.out.println(str1 == str2);	// true
System.out.println(str2 == str3);	// false

 

 

str1과 str2은 같은 리터럴이기 떄문에 같다고 나오지만 str3은 새로운 String 객체를 만들어서 저장했기 때문에 주소값이 다르므로 false

 

 

대표적인 String 메소드

 

메소드 설명
char charAt(int index) 해당 문자열의 특정 인덱스에 해당하는 문자를 반환함
int compareTo(String str) 해당 문자열을 인수로 전달된 문자열과 사전편찬 순으로 비교함(전달된 문자열보다 작으면 음수, 크면 양수, 같으면 0)
int compareToIgnoreCase(String str) 해당 문자열을 인수로 전달된 문자열과 대소문자 구분없이 사전편찬 순으로 비교함
String concat(String str) 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환함
int indexOf(int ch) / int indexOf(String str) /
int indexOf(char ch, int fromIndex) /
int indexOf(String str, int fromIndex)
해당 문자열에서 특정 문자나 문자열이 전달된 인덱스 이후에 처음으로 등장하는 위치의 인덱스를 반환함 (찾을 수 없으면 -1)
int lastindexOf(char ch) /
int lastIndexOf(char ch, int fromIndex)
해당 문자열에서 특정 문자가 전달된 인덱스 이후에 마지막으로 등장하는 위치의 인덱스를 반환함
String[] split(String regex) 해당 문자열을 전달된 정규 표현식에 따라 나눠서 반환함
String substring(int begin) /
String substring(int begin, int end)
해당 문자열을 전달된 인덱스 만큼 잘라서 새로운 문자열을 반환함
String toLowerCase() /
String toUpperCase()
Lower은 모든 문자열을 소문자로 변환 /
Upper은 모든 문자열을 대문자로 변환
String trim() 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백문자를 제거
length() 해당 문자열의 길이를 반환함
isEmpty() 해당 문자열의 길이가 0이면 true 반환 / 아니면 false 반환

 

 

 

StringTokenizer

 

문자열을 지정한 구분자로 쪼개주는 클래스

쪼개진 문자열을 토큰(Token)이라고 부름

실행하기 위해서는 java.util.StringTokenizer를 import 해야함

 

import java.util.StringTokenizer;

public class StringMethod {
    public static void main(String[] args) {
        // StringTokenizer 클래스 연습
        String str = "This is a string example using StringTokenizer";
        StringTokenizer tokenizer = new StringTokenizer(str);
        System.out.println(str);
        
        // int countTokens() : 남아있는 token의 개수를 반환
        System.out.println("total tokens:" + tokenizer.countTokens());
        
        // boolean hasMoreElements(), boolean hasMoreTokens() :
        // 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰을 사용할 수 있는 경우 true 반환
        // 그렇지 않을 경우 false 반환
        // StringTokenizer 내부적으로 어떤 위치의 토큰을 사용하였는지 기억
        while (tokenizer.hasMoreTokens()) {
            // Object nexElement(), String nextToken() : 다음의  토큰을 반환, 반환형이 다름
            System.out.println(tokenizer.nextToken());
        }
        System.out.println("total tockens: " + tokenizer.countTokens());
    }
}

 

<실행결과>

This is a string example using StringTokenizer

total tokens:7
This
is
a
string
example
using
StringTokenizer
total tockens: 0

 

 

 

StringBuilder

 

한번 생성된 String 클래스의 인스턴스는 문자열을 더할 때마다 새로운 인스턴스를 생성해야함

문자열을 더할 때 편리한 클래스

 

public class StringMethod {
    public static void main(String[] args) {
    
    	// StringBuilder 클래스 : 문자열을 쉽게 연결
        StringBuilder stringBuilder = new StringBuilder();
        
        // append(String str) method로 문자열 연결
        stringBuilder.append("문자열 ").append("연결");
        
        // 변수에 넣거나 출력시 toString() method 사용
        String example = stringBuilder.toString();
        System.out.println(stringBuilder);
        System.out.println(example);
   }
}

 

<실행결과>

문자열 연결
문자열 연결

 

 

 

StringBuffer

 

String 클래스는 인스턴스의 값을 읽기만 할 수 있고, 변경할 수는 없음

인스턴스의 값을 변경, 추가할 때 편리한 클래스

 

1. append() 메소드

 

인수로 전달받은 값을 문자열로 변환 후 해당 문자열의 마지막에 추가함

String 클래스의 concat() 메소드와 같은 결과지만 처리 속도가 훨씬 빠름

public class StringMethod {
    public static void main(String[] args) {
        StringBuffer buff = new StringBuffer("Java");
        System.out.println("문자열 : " + buff);
 
        System.out.println(buff.append(" programming"));
        System.out.println("append() 메서드 호출 후 문자열 : " + buff);
    }
}

<실행결과>

문자열 : Java
Java programming
append() 메서드 호출 후 문자열 : Java programming

 

 

 

2. capacity() 메소드

 

StringBuffer 인스턴스의 현재 버퍼 크기를 변환함

기본적으로 생성되는 여유 버퍼 크기인 16에 문자 개수 더한 총 값을 반환

StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());

<실행결과>

16
20

 

 

3. delete() 메소드

 

전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거

deleteCharAt()메소드를 사용하면 특정 위치의 문자 한 개만을 제거할 수도 있음

StringBuffer temp = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + temp);
System.out.println(temp.delete(4,8));
System.out.println(temp.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + temp);

<실행결과>

문자열 : Java Oracle
Javacle
Jvacle
deleteCharAt() 메소드 호출 후 문자열 : Jvacle

 

 

 

4. insert() 메소드

 

인수로 전달된 값을 문자로 변환 후 해당 문자열의 지정된 인덱스 위치에 추가

StringBuffer temp2 = new StringBuffer("Java Programming");
System.out.println("문자열 : " + temp2);
System.out.println(temp2.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + temp2);

<실행결과>

문자열 : Java Programming
JavaScript Programming
insert() 메서드 호출 후 문자열 : JavaScript Programming

 

 


변수(variable)

 

타입이 데이터 종류

변수는 데이터의 저장공간을 의미

변수를 사용하는 이유?

  • 메모리에 데이터의 저장 공간을 확보
  • 다른 개발자와 협업 시 변수명을 붙여 소통
  • 데이터를 재사용

 

변수명 짓기

 

  • 영문자(대소문자), 숫자, _ 사용 가능
  • 카멜 케이스(camelCase)를 사용 🐫
  • 사용할 수 없는 변수명
    • 숫자로 시작하는 변수명
    • 자바에서 이미 사용 중인 예약어(reserved word)

 

 

상수(constant)

 

상수란? 프로그램에서 변하면 안되는 수

자바에서 final 예약어 사용해서 상수임을 알려줌

final double CALCULATOR_PI  = 3.14;

 

상수명은 일반적으로 대문자에 언더바(_)를 넣어 구분 (SCREAMING_SNAKE_CASE)

 

상수를 사용하는 이유?

  • 오타로 인한 에러를 방지
  • 변경하면 안되는 값을 보존
  • 데이터를 재사용

 

 

리터럴(literal)

 

리터럴이란? 프로그램에서 사용하는 모든 숫자, 문자, 논리값을 일컫는 말

변수나 상수에 넣어준 문자나 숫자를 리터럴, 혹은 리터럴 상수 라고 함

프로그램이 시작할 때 시스템에 같이 로딩되어 상수 풀(constant pool)에 놓임

 

 

 

 

타입 변환

 

boolean을 제외한 기본 타입 7개는 서로 타입을 변환 할 수 있음

 

자동 타입 변환

 

  1. 바이트 크기가 작은 타입에서 큰 타입으로 변환
  2. 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)

 

 

수동 타입 변환

 

메모리가 더 큰 타입에서 작은 타입으로 변환 할 때는 자동으로 타입이 변환되지 않음

더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장할 때 캐스팅(casting)함

캐스팅 연산자()를 사용, 괄호 안에 변환하고자 하는 타입 적어주면 됨

int intValue = 30;
byte byteValue = (byte)intValue;

타입을 변환하고자 하는 메모리 내에 담을 수 없는 숫자일 경우 전혀 다른 값이 나올 수 있음

 

 


 

산술 연산자

 

+ : 두 항을 더함

- : 앞의 항에서 뒤의 항을 뺌

* : 두 항을 곱함

/ : 앞의 항에서 뒤의 항을 나눈 몫을 구함

% : 앞의 항에서 뒤의 항을 나눈 나머지를 구함

 

 

비교 연산자

 

boolean을 제외한 나머지 기본 타입에 모두 사용 가능

 

대소 비교 연산자

>

<

>=

<=

 

 

등가 비교 연산자

 

== : 양쪽 항이 같으면 true, 다르면 false

!= : 양쪽 항이 다르면 true, 같으면 false

 

조건 연산자

 

조건식 ? 참일 때의 결과 : 거짓일 때의 결과;

 

 

연산자 우선순위

 

괄호/대괄호 > 부정/증감 연산자 > 곱셈/나눗셈 연산자 > 대소 비교 연산자 > AND 연산자 > OR 연산자 > 조건 연산자

> 대입/할당 연산자

 

 

콘솔 입출력(I/O)

 

콘솔 출력

 

System 클래스는 자바 표준 입출력 스트림

System.out.println() : 출력하고 줄바꿈

System.out.print()

System.out.printf() : 형식대로 출력하기

 

 

콘솔 입력

 

Scanner 클래스를 import 해와야함

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);
String inputValue = scanner.nextLine();

System.out.println(inputValue);

 

입력한 값이 콘솔에 출력됨

 

 

 

그외 메소드

 

Math.abs(int/long/double/float) : 절대값 구하는 메소드

String.format( ) : 문자열 형식을 지정하는 메소드 (C언어의 printf 함수처럼 사용 가능)

  • %s / %S : 문자열
  • %b / %B : boolean
  • %d : 정수형
  • %f : float 형
  • %% : 퍼센트(%) 출력

 

 

 

'TIL(Today I Learned)' 카테고리의 다른 글

5/9 (월) 자바 배열 / 계산기 만들기  (0) 2022.05.09
5/6 (금) 자바 제어문  (0) 2022.05.07
5/3 (화) Git 기초  (0) 2022.05.04
5/2 (월) Linux 기초2  (0) 2022.05.03
5/2 (월) Linux 기초  (0) 2022.05.02

 

 

 

버전 관리 시스템(Vesion control System)

 

텍스트 에디터를 종료한 이후에 다시 들어가서 실수를 고칠 방법이 없음

☞ 이전에 작성했던 내용을 보존해 주는 시스템 (버전 관리 시스템)

 

스냅샷: 특정 시점에 생성된 백업 복사본

commit: 하나하나 스냅샷을 만들어 주는 작업

 

 

버전 관리를 사용하는 이유

  • 파일 변경 이력을 저장할 수 있음
  • 이전 버전으로 돌아갈 수 있음
  • 어떤 변경 사항이 있는지 알아보기 쉬움
  • 협업에 편리
  • 백업용

 

 

Git

 

Git 은 강력한 버전 관리 시스템

버전 관리와 협업 시스템

실제로 실무에서 많이 사용

분산형 버전 관리 시스템

코드 뿐만 아니라 텍스트 파일의 변경점도 하이라이트로 한눈에 볼 수 있음

 

 

 

 

Github

 

  ▷ Git Repository(저장소)를 관리할 수 있는 클라우드 기반 서비스

  ▷ Git Repository: Git으로 관리되는 폴더

  ▷ Git으로 버전을 관리하는 폴더에 대해서 Github를 통해 여러 사람들이 공유하고 접근할 수 있음

  ▷ 개발자들의 SNS

  ▷ 깃허브에서 code review 등을 통해 협업이 가능

  ▷ 수많은 오픈 소스 프로젝트들 호스팅

  ▷ 오픈 소스는 누구나 자유롭게 기능 추가 개선 ☞ 기여(contribute)라고 함

 

 

 

Git Repository

 

Remote Repository와 Local Repository 제공

로컬 저장소에서 작업한 소스를 원격 저장소에 올림

 

 

contribute하기

 

기여할 원격 저장소를 내 원격 저장소로 가지고 와야함 (Fork)

로컬 저장소로 코드를 옮겨옴 (Clone)

변경된 내용을 commit을 통해 저장해주고 원격 저장소에 반대로 올려주는 작업 (Push)

Pull request : 내가 제안한 코드 변경사항에 대해 반영 여부를 요청

Pull : 원격 저장소에서 변경사항이 있을 때 로컬 저장소로 가져오는 작업

 

 

 

Git 설치하기

 

Mac: 터미널에서 git 입력하면 자동으로 설치됨

Windows: https://gitforwindows.org 에서 설치

Ubuntu: 터미널에서 sudo apt install git 입력하면 설치됨

 

git --version 으로 설치한 깃 버전 확인

 

 

 

 

Git 환경설정

 

 

사용자 정보 등록

 

git config --global user.name "나의 사용자 이름"

git config --global user.email "내 이메일 주소"

 

 

 

Git의 에디터

Git에서 commit 기록할 때 (merge commit 확인 메시지가 나올 때) 텍스트 에디터 열림

기본값 vi로 설정되있는데 편의성을 위해 nano로 변경하기

 

git config --global core.editor nano

 

 

 

참고)깃 최초 설정

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95

 

 

 

 

SSH 등록

 

 

SSH 란?

  • Secure shell의 약자
  • 보안이 강화된 shell 접속을 뜻함
  • CLI 환경에서 다른 PC에 접속하거나 요청할 때 사용
  • 비대칭키를 이용해 사용자 인증
  • 터미널에서 SSH를 이용해 git clone 할 수 있음

 

 

터미널에서 ssh키 생성하기

 

ssh-keygen

경로 ~/.ssh/ 에 두 파일 id_rsaid_rsa.pub 생성

id rsa.pub는 공개해도 되는 공개키(public key)

id_rsa는 공개되면 안되고 보관하고 있어야 하는 키(private key, secret key)

 

 

 

public key를 github에 등록하기

 

터미널에 cat ~/.ssh/id_rsa.pub 입력하고 출력된 공개키 복사

 

깃허브 → 우측 상단에 프로필 클릭 → Settings → 왼쪽에서 SSH and GPG keys 선택 → New SSH Key 클릭

→ title 작성하고 Key 박스에 붙여넣기 → Add SSH key → 깃허브 계정 비번 입력

 

여기까지 마쳐야 git clone이 정상적으로 된다.

 

 

CLI 사용을 위한 인증 방법

 

OAuth (Device Authorization) 인증 방법 이용

GitHub CLI 설치

☞ macOS는 homebrew 설치 후 명령어 brew install gh 입력

 

gh auth login 명령어를 통해 로그인 시도

아래 항목들 선택 후 엔터키

What accout do you want to log into? ☞ GitHub.com

What is your preferred protocol for Git Operations? HTTPS

Authenticate Git with your GitHub credentials? Yes

How would you like to authenticate GitHub CLI? Login with a web browser

 

잘못 선택한 경우 Ctrl + C (^ + C) 를 눌러 중단할 수 있음

 

Login with a web browser 옵션 선택하면 one-time code 화면에 나옴

코드 복사 → Enter 키 → Device Activation 창에 코드 입력 → 인증 완료!

 

 

 

Git repository workflow

 

 

 

 

Fork

깃허브에서 다른 계정의 Remote Repository를 내 Remote Repository로 가지고 오기 (Fork)

Fork 버튼 클릭

 

 

git clone

터미널에서 작업을 원하는 폴더 내에서 git clone [repository 주소]

내 컴퓨터(Local Repository)로 가져와짐

 

 

git status

gjit status 명령어로 현재 staging area와 untracked files 목록에 어떤 것들이 있는지 확인

수정된 파일은 modified라고 되어있음

충돌 시 어떤 파일이 충돌했는지 확인 가능

 

 

git add

git status로 출력한 화면에서 modified(변경된 상태) 이지만 changes not staged 인 파일은 git add 명령어로 staging area에 올려줌

git add [파일이름]

git add .  ☞ 폴더 내의 모든 파일 한 번에 staging area로 올림

Staging area 란? Repository에 올라가기 전에 commit 하기 위해 거치는 단계

Staging are에 올린 후 파일을 수정하면? modified 된 파일을 git add 명령어로 다시 Staging area에 올려줘야 함

 

 

git restore

Local Repository에서 작업한 내용을 모두 취소하고 clone 받았던 상태로 되돌리는 명령어

commit 되지 않은 Local Repository의 변경 사항을 폐기

git restore [파일이름]

 

 

git commit

git add 로 staging area에 올라간 파일은 commit 가능

commit 할 때 옵션 -m 을 통해 간단한 메모 가능 (날짜, 변경자, 버전 변경 기록 등)

git commit -m '메시지'

충돌 후 merge 한 commit을 자동으로 올릴 때 명령어 git commit 입력함

 

좋은 commit 메시지를 작성하기 위해 참고할만한 링크

https://cbea.ms/git-commit/

 

How to Write a Git Commit Message

Commit messages matter. Here's how to write them well.

cbea.ms

 

 

git reset

아직 Remote Repository에 올라가지 않은 commit을 취소하는 명령어

git reset HEAD^ / git reset HEAD~1 : 가장 최신의 commit을 취소

HEAD : 현재 branch를 가리키는 포인터, 현재 branch에 마지막 commit의 스냅샷

 

git reset --hardgit reset --soft 의 차이

 

git reset --hard / git reset --soft

hard는 Staging area까지 비우기 때문에 신중하게 써야함!

 

git reset 더 알아보기

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

 

Git - Reset 명확히 알고 가기

지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한

git-scm.com

 

 

git push

Local Repository에 저장되어 있는 commit 기록들을 내 Remote Repository에 업로드

git push [저장소명] [브랜치명]

 

 

git log

현재까지 commit 된 내역들을 터미널 창에서 확인하는 명령어

q 입력하면 종료됨

 

 

Pull Request

내 Remote Repository에 Push 해놓은 변경 사항에 대해서 함께 작업하는 다른 사람들에게 알리는 것

줄여서 PR이라고 함

Push 한 후에 내 Remote Repository에 가면 Pull Request 할 수 있는 버튼 생김

 

 

git init

내 컴퓨터에 존재하는 디렉토리를 Git의 관리하에 들어가게 만들어주는 명령어

Git Repository로 변환

새로운 Repository를 초기화 할 때도 사용

 

 

git remote

현재 저장소의 모든 리모트 저장소를 조회

 

git remote add [저장소 이름] [Remote Repository 주소] 

  ☞ Local Repository를 Remote Repository에 연결, 다른 사람의 Remote Repository와도 연결 가능

 

git remote -v

  ☞ 현재 Local Repository와 연결된 모든 Remote Repository 목록 확인

 

 

git pull

git pull [저장소명] [브랜치명]

Remote Repository에 있는 작업내용을 불러옴

받아온 내용은 자동 병합(merge) 됨

 

 

충돌

동시에 같은 부분을 변경하고 push 하면 충돌이 발생할 수 있음 → 보통은 자동 병합(merge)되지만 실패하는 경우도 있음

터미널에 Merge conflict가 발생해서 Automatic merge에 실패했다고 메시지 뜸

충돌한 파일을 수정 완료 했다면 stagining area에 파일 추가

충돌 해결후 staging area에 올리면 자동으로 commit 메시지가 생성됨 (그대로 사용하거나 수정 가능)

Remote Repository에 다시 업로드

 

 

 

 

 

이 글은 MacOS를 기준으로 작성되었습니다.

 

 

 

○ 패키지와 패키지 매니저

 

리눅스에서 패키지는 포장된 상품 패키지 매니저는 온라인 쇼핑몰

여러 파일을 담고있는 하나의 파일이 패키지

패키지의 구성

  • 프로그램 파일
  • 프로그램 설치 파일
  • 프로그램 설치 설명서
  • 프로그램에 대한 정보를 담은 파일

 

패키지에는 프로그램을 설치하기 위한 다른 프로그램 설치 파일 정보도 포함

 

 

 

MAC 패키지 매니저 : Homebrew

 

https://brew.sh/

 

Homebrew

The Missing Package Manager for macOS (or Linux).

brew.sh

 

 

 

 

애플 실리콘(M1) 사용 시 주의사항

기존 인텔 칩과 다른 ARM 아키텍처 사용하므로 인텔 칩 기준으로 만들어진 프로그램은 호환하지 않을 수 있음

→ 해결: 에뮬레이션 환경 Rosetta 설치

 

softwareupdate --install-rosetta

 

※ 현재 사용중인 프로세서(칩셋) 확인 명령어

uname -p

☞ arm : M1 칩셋

brew 명령어 전에 arch -x86_64 붙여줘야 함

arch -x86_64 brew install 설치할프로그램

 

 

 

 

 Read, Write, Execute 권한

 

 

drwxrwxrwx

 

프롬프트에  ls -l  입력했을 때

 

 ▷  -rw-r--r-- : -는 not directory라는 의미, 파일

 ▷  drwxr-xr-x : d는 directory라는 의미, 폴더

 ▷ 첫글자 뒤에 이어지는 r, w, x는  각각 읽기 권한(read permission), 쓰기 권한(write permission), 실행 권한(excute permission)

 ▷ 3번에 걸쳐 나타나는 이유? 순서대로 사용자와 그룹, 나머지에 대한 권한 표시

 

 

 

user, group, other

 

 ▷ user : 파일의 소유자, 파일을 만든 사람이 소유자가 됨

 ▷ group : 여러 명의 user 포함 가능, 그룹에 속한 모든 유저는 파일에 대한 동일한 권한 가짐, 많은 사람이 파일에 엑세스 해야 하는 프로젝트에서 여러명을 그룹에 추가하여 권한 한번에 할당

 ▷ other : 파일에 대한 엑세스 권한이 있는 다른 user, 파일을 만들지 않은 모든 유저, global 권한 설정

 

 

 

 

chmod 명령어

 

  • 읽기, 쓰기, 실행 권한을 변경하는 명령어
  • 로그인한 사용자와 소유자가 같을 경우에 chmod로 권한을 변경할 수 있음
  • 소유자가 다를 경우엔 sudo 명령어를 통해 권한 변경

 

변경하는 방법 (Symbolic method, Absolute form)

 

- Symbolic method

 

u/g/o +(add access)/-(remove access)/ =(set exact acess) r/w/x

a: all

 

Access class Operator Access Type
u (user) + (권한 주기) r (읽기)
g (group) - (권한 뺏기) w (쓰기)
o (other) = (권한 지정) x (실행)
a (all: u, g, o)    

 

ex)

chmod g-w filename

☞ group 의 write 권한 뺏기

 

 

 

- Absolute form

 

  • 숫자 7까지 나타내는 3bits 의 합으로 표기
  • r : 4, w : 2, x : 1
  • 만약에 user는 rwx 를 group는 rw-, other는 r--x 로  권한 변경
  • 숫자의 합을 user, group, other 순으로 입력
  • chmod 765 hello.java

ex)

chmod 751 filename

user : 4+2+1 ( 모든 권한 부여 ), group : 4 ( 읽기, 실행 권한 부여 ), other ( 실행 권한만 부여 )

 

 

 

 

 환경변수

 

프로그램 동작에 영향을 미치는 동적인 값들의 모임

스마트폰에서 환경설정으로 시스템을 세팅하는 것과 마찬가지로 환경변수를 설정해서 프로그램이 동작하는 환경을 설정함

 

 

 

지역 환경변수와 전역 환경변수

 

지역 환경변수: 생성한 특정 사용자만 사용할 수 있음

전역 환경변수: 모든 사용자가 사용할 수 있는 환경변수, 명령어 export 사용해서 새로운 환경변수 추가

[환경 변수 이름]='변수값'

등호  앞뒤에 공백이 없어야함

저장하고자 하는 변수에 공백 존재할 시 값 전체를 따옴표로 감싸주어야함

 

▶ 환경변수의 값 확인하기

echo 명령어로 확인

echo $환경변수

환경변수 앞에 달러표시($) -> 터미널에 뒤의 문자열이 환경변수라고 전달

 

 

 

환경변수 영구 적용하기

 

영구히 적용하면 터미널을 닫거나 재부팅해도 환경변수가 저장되어 있음

 

 

- 지역 환경변수 영구 적용하기

nano .zshrc 입력하여 편집창 열기

→ ^V (next page)로 마지막 페이지로 이동한 다음 설정하고자 하는 환경변수 작성하고 저장

ex) export LOCAL_EXPERIMENTAL_VARIABLE="This is local experimental variable"

→ source .zshrc 입력하여 변경 내용 저장

→ 출력: echo $LOCAL_EXPERIMENTAL_VARIABLE

참고) source 명령어 : 스크립트 파일을 수정한 후 수정된 값을 바로 적용하기 위해 사용하는 명령어

 

 

- 전역 환경변수 영구 적용하기

1. 변경하고자 하는 파일의 권한 수정(sudo chmod )
2. 파일 편집기로 들어가서 export [전역환경변수이름]=환경변수값 입력

3. source [파일이름] 입력하여 변경 내용 저장

4. 출력 (echo)

 

 

- 생성된 환경변수의 목록으로 확인하기

export 명령어

운영체제 내에 이미 설정되어있는 환경변수와 export 명령어로 설정한 환경변수를 목록으로 확인할 수 있음

 

- Windows 운영체제에서는 환경변수를 영구적으로만 설정할 수 있음

한번 설정해두면 사용자가 삭제하기 전까지 사라지지 않음

 

 

 

 

 

참고) 파일이 클 때 cat 명령어 대신 쓰는 명령어

 

cat 명령어는 항상 파일 안의 전체 내용을 출력하기 때문에 파일 용량이 크면 잘려서 나오는 등의 문제가 있음

cat 대신 부분만 보여주는 명령어 사용

 

 

1. head

파일의 지정한 만큼의 앞부분만 출력

텍스트 기반은 내용을 보여주지만 binary로 된 파일은 알 수 없는 문자로 출력됨

head [-n lines / -c bytes] [file]

head [파일명] : 앞에서 부터 10행만 보여줌

head -n 100  [파일명] : 앞에서 부터 100행(라인)까지 보여줌

head -100 [파일명 ]: 위와 동일

head -c 100 [파일명] : 앞에서 부터 100byte의 내용만 보요줌

head -100 [파일명] > 저장할파일명 : 출력되는 파일의 내용을 추출해서 저장

 

 

2. tail

head 와는 반대로 마지막 행을 기준으로 지정한 만큼 출력

리눅스에서 오류나 파일 로그를 실시간으로 확인할 때 매우 유용하게 사용됨

tail [옵션] [파일] : 지정한 행까지 출력할 때는 옵션 -n 사용 / 특정 행 부터 마지막 행ㄲ까지 출력하고 싶을 때는 +사용 / 바이트 기준으로 할 때는 -c / 실시간으로 모니터링 할 경우 -f

tail [파일] : 파일의 끝에서부터 10행만 보여줌

 

 

3. more

파일을 읽어 화면에 화면 단위로 출력

more [파일명]

왼쪽 하단에 출력한 내용이 전체의 몇 % 인지를 표시

엔터 키를 입력하면 한 줄씩 출력

스페이스 바를 입력하면 한 화면씩 출력

 

 

4. less

less는 한 번에 보여지는 만큼만 읽어서 출력

less [파일명]

엔터 키를 입력하면 한 줄씩 출력

스페이스 바를 입력하면 한 화면씩 출력

방향키로 페이지 이동 가능

 

 

 

 

 

 

 

 

이 글은 맥 OS를 기준으로 작성되었습니다.

 

 

 

 

○ CLI 와 GUI

 

 

명령줄 인터페이스(Command-Line-Interface, CLI)

 

  • 명령어로 컴퓨터를 제어하는 방식
  • 그래픽 작업을 안 거치기 때문에 빠르고 안정적
  • AWS(Amazon Web Service) 같은 서버는 CLI 사용
  • 터미널, 도스 등

 

 

그래픽 사용자 인터페이스(Graphic User Interface, GUI)

 

  • 사용자가 편리하도록 입출력 기능을 쉽게 그래픽으로 나타내어 클릭 등으로 쉽게 컴퓨터를 제어하는 방식
  • 그래픽에 컴퓨터 자원을 사용해서 CLI 보다는 느림
  • 윈도우, 맥 등

 

 

프롬프트(Prompt)

  • 터미널에서 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간
  • CLI의 명령줄 대기모드

 

 

 

○ CLI 기본 명령어

 

 

 

※ CLI에서 명령어와 생성할 폴더 이름 사이 공백으로 구분

ex) mkdir wjcodding

 

pwd : 현재 위치 확인하기

print working directory의 약자

현재 작업중인 폴더 위치 출력

 

 

mkdir : 새로운 폴더 생성

make direcotries

 

 

ls : 특정 폴더에 포함된 파일, 폴더 확인하기

  • list의 약자
  • 자주 같이 사용하는 옵션(‘ - ‘를 이용해 옵션을 입력했다고 컴퓨터에 전달)
  • ls -l (파일의 포맷을 전부 표현)
  • ls -a (all, 숨어있는 폴더나 파일을 포함한 모든 항목 출력)
  • ls -al 또는 ls-la (옵션의 순서는 기능에 영향 미치지 않음)로 사용
  • -l 옵션에서 맨 앞에 d로 시작하는 건 폴더(directory), -로 시작하는 건 파일

 

 

open .

현재 위치를 GUI로 열음

 

 

cd

change directory의 약자

폴더로 진입

 

 

touch

파일을 생성

 

 

cat

  • 파일의 모든 내용을 터미널에 출력
  • 파일을 연달아 입력하면 순차적으로 출력
  • 크기가 큰 파일을 출력할 때는 비효율적

 

 

rm

  • remove 폴더나 파일 삭제
  • 휴지통을 거치지 않고 삭제됨
  • 파일 삭제할 떄는 'rm [파일명]' 으로 사용
  • 폴더 삭제할 때 rm [폴더명]만 입력하면 오류 뜸
  • 폴더 삭제시에는 'rm -r [폴더명]'

 

 

<자주 사용하는 옵션>

-f : force, 강제로 파일이나 폴더를 삭제하고 대상이 없는 경우에는 메시지를 출력하지 않음

-r : recursive(재귀적), 폴더 지움

-d : 비어있는 폴더들만 제거

-i : 매번 삭제할때마다 사용자에게 삭제할것인지 물어봄

-l : 3개의 이상의 파일을 삭제하거나 폴더 내부가 비어있지 않을때만 삭제할것인지 물어봄

-v : 삭제되는 대상의 정보를 출력

 

 

mv

  • move의 약자
  • 폴더나 파일의 이름 변경, 또는 위치 옮기기
  • 위치 옮기기: mv [옮길 폴더나 파일의 이름] [도착할 폴더 이름]
  • 이름 바꾸기: mv [바꿀 폴더나 파일 이름] [변경하고자 하는 이름]

 

cp

  • copy의 약자
  • 폴더나 파일 복사하기
  • 파일 복사하기: cp [원본 파일 이름] [복사할 파일 이름]
  • 폴더 복사하기: cp -rf [원본 폴더 이름] [복사할 폴더 이름]

 

 

clear

터미널 정리하기

 

 

history

이전에 사용한 명령어 확인하기

 

 

man

명령어 메뉴얼 확인하기

 

 

-h 또는 --help

명령어의 옵션 확인하기

명령어 이름만 입력해도 됨

 

 


 

 

○ 관리자 권한

 

절대 경로와 상대경로

 

절대경로

처음부터 시작하여 현재까지 절대적인 경로

기준점 : 루트 폴더(/,최상위)

' / '(root, 루트)는 Linux의 관리자 영역

Linux는 사용자와 관리자 명확히 분리

  • 사용자가 필요할 때마다 관리자권한(프로그램 변경, 설치, 삭제)만 부여받음
  • 루트폴더로 이동해서 mkdir로 폴더 생성하려하면 Read-only file system 에러(파일을 읽을 수만 있고 생성,변경,삭제는 할 수 없다는 뜻)

루트 폴더는 관리자의 영역임, 사용자 권한으로는 할 수 있는 일이 없음

현재 로그인된 사용자를 확인하는 명령어 : whoami

관리자는 사용자 폴더는 물론 시스템 자체에도 접근이 가능

관리자 권한으로 변경한 내용은 사용자 권한으로 해결 못함

 

 

상대경로

현재 위치를 기준으로 상대적인 경로

최상위(/)를 거치지 않고도 이동이 가능

 

 

사용자와 관리자

 

 

 

※ CLI 경로

.

현재폴더

 

..

현재 폴더보다 앞에 있는 폴더

 

/

경로 사이에 쓰는 슬래시는 폴더를 의미

폴더 대상일 땐 마지막 슬래시 생략 가능

~/helloWorld/hello/ 와 ~/helloWorld/hello 는 동일한 위치

 

~

현재 작업 폴더가 홈폴더라는 의미, 홈폴더로 이동하는 명령어

(Mac은 [사용자이름]@Macbook ~ %)

 

 

 

sudo

  • 사용자가 관리자 권한을 얻을 수 있는 명령어
  • 명령어 앞에 작성하면 관리자 권한으로 명령 실행
  • ex) sudo mkdir hello
  • 관리자(staff또는 root) 소유의 폴더
  • 관리자 권한으로 프로그램 설치,변경 또는 삭제하는 권한을 차단하여 시스템을 안전하게 보호
  • sudo를 사용한다고 사용자가 관리자가 되는 것은 아님!

 

 

 

 CLI 환경 에디터

 

  • vim(vi), emacs, nano 등
  • vim과 emacs는 진입장벽이 있음
  • nano는 리눅스, 맥에 기본으로 깔려있고 난이도가 쉬운 편

 

nano

실행: 'nano [파일명]' 또는 'nano' 명령어로 그냥 실행할 수 있다.

 

 

 

 

 

 

오늘 처음으로 페어 프로그래밍이란 것을 해보았다.

 

프로그래밍 목표는 Twittler Mockup 사이트 만들기 였다.

트위틀러는 트위터와 비슷한 클론 페이지를 만드는 예제이고

목업(Mockup)은 대부분의 산업에서 실물크기의 모형을 말하는데

웹, 앱 프로그래밍에서는 실제 페이지와 동일한 모양으로 구현하는 것이다.

 

페어 프로그래밍을 진행하는 방식은 두명 혹은 세명이 있으면 한명이 드라이버를 하고 나머지가 네비게이터를 하는 방식으로 진행한다. 드라이버는 화면을 공유하면서 직접 코드를 입력하면서 나무를 보는 역할이고 네비게이터는 드라이버에게 코딩 방향을 제시하고 전체적인 숲을 보는 역할이다.

 

프로그래밍을 코드샌드박스라는 플랫폼에서 진행했는데 중간에 자바스크립트에 있는 데이터가 연결이 안되서 하단 부분 데이터가 전부 날라가는 문제가 생겼었다.

게다가 실행 창이 반영이 잘 안되는 것 같아 VSCode로 옮겨가서 하려니까 이번엔 자바스크립트 파일에서 모듈 오류가 났었다.

해당 오류 때문에 데이터가 들어있는 자바스크립트와 연결이 제대로 되지 않아 데이터가 화면에 나오질 않았다...

 

개발자 도구에서 본 모듈 오류 화면

 

자바스크립트는 이미 코딩이 된 완성본을 받아서 한거고 나와 페어 모두 자바스크립트는 처음이라서 바로 해결하지 못하고 각자 찾아보기로 하였다. 알 수없는 오류에 좀 당황했지만 페어가 침착한 분이라 차분하게 생각할 수 있었다.

 

구글링을 해보니까 어느정도 자바스크립트에 대한 이해없이 바로 해결할 수 있는 문제는 아닌 것 같아 불편하더라도 코드샌드박스 홈페이지에서 할 수 밖에 없을 것 같았다. 코드를 복사해서 코드샌드박스를 새로 불러와서 붙여넣기하니까 다행히 정상적으로 작동했다. 페어는 flexbox 속성을 가진 태그에 자바스크립트를 불러오는 태그가 들어가서 그런 것 같다고 하였는데 정확하게 왜 그런진 모르겠다.

 

그래도 다시 정상적으로 코드가 돌아가서 시간안에 괜찮은 결과물을 완성할 수 있었다.

 

 

 

 

지금까지는 혼자 코딩하다가 다른 사람과 같이 프로젝트를 진행해보니까 내 약점과 강점이 보였다.

 

 

 

 

 

결과물을 자랑하는 시간도 가졌는데 우린 바로 당당하게 자랑할 수 있었다.

다 만들었을 때 그 보람과 뿌듯함은 굉장했고 페어에게 정말 감사했다 ! 😆

 

 

 

↓↓↓↓↓↓↓↓↓↓ 완성본 ↓↓↓↓↓↓↓↓↓↓↓↓

 

트위틀러 목업 페이지 전체 스크린샷

 

 

https://ic12jb.csb.app/

 

twittler

 

ic12jb.csb.app

 

'TIL(Today I Learned)' 카테고리의 다른 글

5/2 (월) Linux 기초2  (0) 2022.05.03
5/2 (월) Linux 기초  (0) 2022.05.02
4/28 (목) 페이지 레이아웃 / FlexBox  (0) 2022.04.28
4/27 (수) CSS 기초  (0) 2022.04.28
4/27 (수) HTML 기초  (0) 2022.04.27

 

○ CSS란?

 

  • Cascading Style Sheets
    • cascading ? css에서 작성하는 코드가 폭포같이 이어지기 때문
  • 웹페이지를 꾸미려고 작성하는 코드
  • 프로그래밍 언어도 마크업 언어도 아닌 Style Sheet 언어
  • HTML 요소들에 선택적으로 스타일을 적용할 수 있음

 

 

 

 

 

 HTML에 CSS 연결하기

 

  • html 문서 head에 <link rel="stylesheet" href="파일이름.css" /> 입력
  • html과 css를 같은 폴더에 저장한 경우 파일 이름만 작성, 경로가 다르면 경로 입력해야함
  • css 파일을 따로 작성하지 않고 html 문서에 속성 부여할 수도 있지만 관심사 분리 측면에서 권장되지 않음
  • 관심사 분리?
    • 관심사는 코드에 영향을 미치는 정보 집단
    • 코드에 조건이나 기능들이 추가되면 코드가 길어져서 가독성이 떨어짐
    • 관심사들은 따로 작성해서 분리하는 것이 좋은 코드

 

 

 

 CSS 기본 구조

 

CSS 기본 구조

 

셀렉터(selector) : html에서 스타일을 적용할 곳을 지정

선언(Declaration) : 1개의 스타일을 입력하고 세미콜론(;)

속성(Property) : 적용할 스타일 이름

속성값(Property Value) : 지정할 속성의 값을 입력

 

 

 

 

 


 

 

 셀렉터(selector)

 

- id

  • html 문서에 1개의 요소에만 적용할 수 있음
  • html에 <요소이름 속성1... 속성2... id=“id Name”>
  • CSS에서 해당 id에 적용할 때 ‘#id Name{ ... }

 

 

 

- class

  • html 문서에서 여러개의 요소에 한번에 적용할 때 사용
  • html에 <요소이름 속성1... 속성2... class=“class Name”>
  • CSS에서 해당 class에 적용할 때 ‘.class Name{ ... }
  • 하나의 요소에 띄어쓰기로 여러개의 class 적용 가능
<p class=“class1 class2 class3> </p>

 

 

- *

  • 전체 선택자
  • 페이지 전체 적용할 폰트(font-family) 또는 박스 사이즈를 border-line으로 셋팅할 때 사용
* {
	box-sizing: border-box;
}

 

 

- 유형 선택자

  • 해당 이름을 가진 모든 요소 선택
input {
	border: 1px solid red;
}

   ↑ 페이지 내 모든 input 요소 선택

 

 

- 선택자 목록

  • ' , ' 로 선택자 여러개 한번에 선택
input, button { }

 

 

- 자손 / 후손 결합자

  • '  '
  • 공백은 공백 앞 요소의 자손인 모든 공백 뒤 요소 선택
  • ex) div span { }  --> <div>의 자손인 모든 <span> 선택
  • 자손은 자식의 모든 하위 요소까지 포함 (자식의 자식, 자식의 자식의 자식, ...)

 

 

- 자식 결합자

  • ' > '
  • 첫번째 요소 바로 아래 자식인 요소들 선택
  • ex) div > span { } --> <div>의 자식인 모든 <span> 선택

 

 

- 일반 형제 결합자

  • ' ~ '
  • 첫 번째 요소와 같은 부모를 공유하는 두 번째 요소들 선택
  • ex) p ~ div { } --> <p>와 같은 부모를 공유하는 모든 <div> 선택

 

 

- 인접 형제 결합자

  • ' + '
  • 첫 번째 요소 바로 뒤에 위치하면서 같은 부모를 공유하는 두 번째 요소 선택
  • ex) p + div { } --> <p> 바로 뒤에 위치하는 <div> 선택

 

 

- 속성 선택자

  • 요소[속성]
  • 요소에 특정 속성이 있는지에 따라 요소 선택
  • ex) input[type="text"] --> input 요소에 속성이 'type' 이고 속성값이 'text' 인 모든 요소 선택

 

 

-의사 클래스/요소(pseudo-classes / pseudo-elements)

  • ' : ' / ' :: '
  • 의사 클래스(가상 클래스) ' : ' 는 요소가 특정 상태일 때만 스타일링
  • 자주쓰는 의사 클래스
pseudo-class 설명
:hover 마우스 포인터를 요소에 가리킬 때만 스타일 적용
:first-child 형제 요소 중 제일 첫 요소가 해당 요소일 때 선택
:last-child 형제 요소 중 제일 마지막 요소가 해당 요소일 때 선택
:nth-child(4) 형제 요소 중 해당 요소가 (4) 번째일 때 선택
:nth-child(even) / :nth-child(2n) 형제 요소 중 짝수번째 요소가 해당 요소일 때 선택
:nth-child(odd) / :nth-child(2n-1) 형제 요소 중 홀수번째 요소가 해당 요소일 때 선택
:first-of-type nth-child 와는 다르게 형제 요소 중 같은 요소 중에서 첫 번째 요소 선택
:last-of-type 형제 요소의 같은 요소들 중 가장 마지막 요소 선택
:nth-of-type(3) 형제 요소의 같은 요소들 중 (3) 번째 요소 선택
:not(:first-of-type) 부정 셀렉터, 요소 중 괄호 안의 조건을 만족시키는 요소를 제외한 모든 요소 선택

 

 

  • 의사 요소(가상 요소) ' :: ' 는 요소의 특정 부분을 선택
  • 자주쓰는 의사 요소
pseudo-element 설명
::first-line 해당 요소의 첫번째 줄만 선택
::first-letter 해당 요소의 첫번째 글자만 선택
::before 특정 요소의 내용(content) 부분 바로 앞에 다른 요소 삽입할 때 사용
::after 특정 요소의 내용(content) 부분 바로 뒤에 다른 요소 삽입할 때 사용
::selection 해당 요소에서 사용자가 선택한 부분만을 선택

 

 

 

- 정합성 확인 셀렉터

  • ':valid' / ':invalid'
  • valid는 정합성 검증이 성공한 요소에만 적용 / invalid는 정합성 검증이 실패한 요소에만 적용
  • ex) input[type="text"]:invalid { } --> input 요소 중 속성이 type="text"가 아닌 요소만 선택

 

 

- 셀렉터의 우선순위

한 요소에 대해서 서로 다른 셀렉터가 같은 속성의 다른 속성값을 가질 경우 셀렉터 우선순위에 따라 상위 우선순위의 속성값을 갖게 됨

 

!important (속성값 뒤에 작성, 우선순위 0순위) -> inline style (태그에 직접 스타일 지정)

-> id 셀렉터 -> class 셀렉터 -> 속성 선택자 -> 의사(가상) 클래스 -> 의사(가상) 요소 -> 태그 선택자 -> 전체 선택자

 

 

 

 


 

 

 

 박스 모델

  • 모든 content는 각자의 영역을 가지고 하나의 content로 묶이는 요소들이 하나의 박스가 됨
  • 박스는 항상 직사각형 모양이고 너비(width)와 높이(height)를 가짐
  • html의 블럭 레벨 요소는 CSS에서 width, height 속성이 적용되지만 인라인 레벨 요소는 적용되지 않음
  • CSS에서 inline 요소 태그에 ‘display: inline-block’ 를 추가하면 inline-block 요소로 성질이 변함
  • 줄은 바뀌지 않지만 고유 크기 지정해줄 수 있음

 

 

 

○ 박스에서 많이 쓰는 속성(Property)

 

  • width: 너비 (단위는 주로 px, % 사용)
  • height: 높이 (단위는 주로 px, % 사용)
  • border: padding 바깥 테두리 (value 차례대로 두께, 스타일, 색깔)

 

border 스타일 선 모양

 

  • padding: 컨텐츠 주위의 여백 (border의 안쪽 여백)
  • margin: 요소의 바깥 여백 (border의 바깥 여백)

 

 

padding, margin 은 공통적으로 위, 아래, 오른쪽, 왼쪽의 여백을 따로 지정할 수 있다.

 

padding: 10px 20px 30px 40px;

순서대로 위, 오른쪽, 아래쪽, 왼쪽 값

한개의 값만 지정하면 네 방향 동시에 같은  값 지정됨

 

 

padding-top: 10px;
padding-right: 20px;
padding-bottom: 30px;
padding-left: 40px;

네 방향 각각 따로 지정할 수 있음

참고) padding, margin 의 속성값을 두 개만 지정했을 경우 차례대로 위아래, 양쪽에 적용됨

 

 

  • background-color: 요소의 콘텐츠와 padding 의 배경 색
  • color: 한 요소의 콘텐츠 색 (일반적으로 글자색)
  • text-shadow: 한 요소 안의 글자에 그림자를 적용
  • display: 요소의 표시 형식을 설정합니다 (flexbox로 만들 때 사용)
  • border-radius: 모서리의 굴곡 설정 (둥근 모서리 만들때 사용)
  • shadow

 

 

 

 

< 참고 링크 >

 

https://developer.mozilla.org/ko/docs/Learn/Getting_started_with_the_web/CSS_basics

 

CSS 기초 - Web 개발 학습하기 | MDN

CSS (Cascading Style Sheets)는 웹페이지를 꾸미려고 작성하는 코드입니다. CSS 기초 에서 여러분이 처음 시작하며 필요한 내용을 익히도록 도와드립니다. 저희는 다음과 같은 질문에 관한 답을 드리겠

developer.mozilla.org

 

https://www.w3schools.com/

 

W3Schools Free Online Web Tutorials

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

 

 

□ HTML이란?

 

- Hypertext Markup Language

- HTML은 프로그래밍 언어가 아닌 마크업(Markup) 언어

더보기

마크업 언어란? 태그 등을 이용하여 문서나 데이터의 구조를 명기하는 언어

- 웹페이지의 구조와 내용 기술

 

 

 

 

□ Visual Studio Code로 작성하기

 

- 새 파일 -> 언어선택 -> html -> 저장시 이름.html 형식으로 저장

- VSC에서 코드작성할 때 단락 자동 정렬해주는 extension

확장 탭에서 beauty 검색 -> 설치

정렬 원하는 코드 드래그 -> command+shift+b (Win: Ctrl+shift+b)

 

 

 

 

□ Element의 구조

 

  1. Opening tag(여는 태그): 요소 이름과 꺽쇠(<>)로 구성, 요소 시작
  2. Closing tag(닫는 태그): 여는 태그와 같은 모양 + 요소 이름 앞에 슬래시(/), 요소의 끝에 위치
  3. Contents(내용): 요소의 내용
  4. Element(요소): 여는 태그, 닫는 태그, 내용을 통틀여서 요소라고 함
  5. Attribute(속성): 요소에 추가적인 내용을 담고 싶을 때 사용, 속성 이름(Attribute name)과 속성 값(Attribute value)로 구성

 

 

Element의 구조

 

 

 

 

□ 요소의 중첩

 

- 요소안에 내포되게 중첩할 수 있음

- 어떤 요소의 여는 태그와 닫는 태그 사이에 새로운 요소 넣을 수 있음

- 안에 내포된 요소가 닫힌 후에 포함하고 있는 요소가 닫혀야 함

<head>
	<title>Test page</title>
</head>

 

 

 

 

□ 블럭 레벨 요소vs 인라인 요소(Inline level elements)

 

1. 블럭 레벨 요소(Block-level elements)
- 웹페이지에 블럭을 넣는 요소

- 블럭 레벨 요소 앞뒤에 새로운 Line 만들어서 블럭 레벨 요소 이전과 이후 요소 사이의 줄을 바꿈

- 페이지의 단락(Paragraph), 목록(list), 네비게이션 메뉴(Navigation Menu, 꼬리말(Footer) 등을 표현

- 인라인 요소에 중첩될 수 없음

- 블럭 레벨 요소는 다른 블럭 레벨 요소에 중첩될 수 있음

ex)<p> : 문단요소

 

 

2. 인라인 요소(Inline elements)

- 항상 블록 레벨 요소에 포함되어 있음

- 새로운 Line을 만들지 않음

- 인라인 요소에 블럭 레벨 요소를 넣을 수는 없음

ex) <a> : 하이퍼링크 정의

      <em> : 텍스트 이테릭체

      <strong> : 텍스트 볼드체

 

 

- 인라인과 블럭 레벨 요소의 특징이 섞인 Inline-Block 레벨 요소도 있음(

 

 

 

 

□ 빈 요소(Empty elements)

 

닫는 태그가 필요없이 단일 태그(Single tag)로 사용

닫는 태그를 사용해도 되지만 비효율적!

Ex) <img> : 이미지 삽입, <br> : 줄바꿈 요소, <hr> : 가로줄, <input> : 사용자에게서 데이터 받을 수 있는 요소, <link> : 외부 리소스의 관계 명시, <meta> : 해당 문서에 대한 정보인 메타데이터 정의

 

 

 

 

 속성(Attribute)의 규칙

 

  1. 요소 이름 다음에 오는 속성과 요소 사이엔 공백, 여러개의 속성 작성 할 땐 속성 사이에 공백
  2. 속성 이름 다음에 등호(=) 작성
  3. 속성 값은 따옴표(“”또는 ‘’)로 감싸야 함 (생략가능하지만 오류 발생할 수 있음)
<input type="text" placeholder="type here">

 

 

 

 요소에 속성 추가하기

 

<a href="https://naver.com" title="네이버" target="_blank">naver</a>

<a> : anchor 의미, 닻이 배를 항구로 연결하듯 텍스트를 감싸서 하이퍼링크를 만듦

href: 연결하고자 하는 웹 주소 지정

title: 링크에 대한 정보 추가, 마우스 옮겼을 때 나타남

target: 링크가 어떻게 열릴 것인지 지정, target=“_bland”는 새 탭에서 보여줌

 

 

 

 

 참과 거짓 속성(Boolean attributes)

 

값이 없는 속성

그 속성의 이름과 동일한 하나의 값만을 가짐

ex) disabled : 사용자가 데이터를 입력할 수 없도록 비활성화(회색으로 표시)

<input type="text" disabled>

 

 

 

 

 주석

 

<!- 주석내용 ->

사용자에게 보이지 않음

메모, 코딩 설명

 

 

 

 

 

  자주 쓰는 요소들

 

<!DOCTYPE html>: 초창기부터 쓰던 문법, 현재는 제대로 작동하기 위해 포함되어야하는 역사적 유물

<html></html> : html 요소, 전체 페이지의 콘텐츠 포함, 기본요소

<head></head> : 페이지에 보여지지 않지만 검색 결과에 노출될 키워드, 설명, CSS 스타일 등 페이지의 모든 내용 담음

<meta charset="UTF-8"> : 문서의 문자 인코딩을 UTF-8로 지정

 UTF-8이란 전세계 대부분의 문자를 포함한 유니코드 인코딩 방식, 가장 많이 사용됨

<title></title> : 브라우저 탭에 표시되는 이름

<body></body> : 텍스트, 이미지, 링크, 비디오, 오디오 등 페이지에 표시되는 모든 콘텐츠 포함

<ul></ul> : Unordered list 순서없는 리스트

<ol></ol> : Ordered list 순서있는 리스트

<ls></ls> : list 목록

<p></p> : paragraph 문단

<div></div> : division 앞뒤로 줄 바꿈됨

<span></span> : 인라인, 줄 바꿈 x, 문단내에서 일부에만 속성 적용할 때 주로 사용

<a></a> : 하이퍼링크

<img src="경로"> : 이미지 삽입

<input type="text" placeholder="입력 전 메세지"> : 사용자가 입력할 수 있는 박스, type의 기본값은 text

<button>버튼 안의 텍스트</button> : 클릭할 수 있는 버튼 박스

<link rel="stylesheet" href="경로"> : 외부 리소스 연결 요소, 주로 head에 작성, CSS 파일이나 웹 폰트 연결할 때 사용

 

 

 

 

 참고 링크

 

W3 School : https://www.w3schools.com/html/default.asp

 

HTML Tutorial

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

HTML

 

 

 

튜토리얼: https://developer.mozilla.org/ko/docs/Learn/HTML/Introduction_to_HTML/Getting_started

 

HTML 시작하기 - Web 개발 학습하기 | MDN

HTML 기본 사항을 둘러 보셨기를 바랍니다.

developer.mozilla.org

 

<컴퓨터의 구성요소>

 

-소프트웨어

 

System Software

응용소프트웨어 실행 환경

하드웨어와 직접 소통, 동작 관리

커널과 OS를 포함

 

Application Software

응용소프트웨어

 

 

-하드웨어

 

CPU(중앙처리장치, 프로세서)

제어장치: 데이터의 흐름 제어, 컴퓨터의 자원 관리

연산장치: 프로그램의 코드에 따라 계산

레지스터: 작고 빠른 기억장치, 연산에 필요한 데이터를 임시 보관

 

보조기억장치

넓은 데이터 저장 공간

느린 속도

컴퓨터 내의 모든 메모리가 저장

ex) HDD(Hard disk drive), SSD(Solid State Drive)

CPU와 바로 통신하기에는 처리속도가 너무 느림

 

주기억장치

보조기억장치보다 훨씬 적은 공간

빠른 속도

CPU와 직접 통신

RAM(Random Access Memory), ROM(Read Only Memory)

 

캐시 메모리(cache memory)

주기억장치보다 빠르지만 CPU보단 느린 속도

자주쓰는 데이터를 저장

 

입력장치

마우스, 키보드

 

출력장치

스피커, 모니터

 

시스템 버스(system bus)

컴퓨터내에 존재하는 데이터가 이동하는 통로

데이터 버스, 주소 버스, 제어 버스

 

 

 

 

<프로그래밍 용어>

 

프로그래밍: 알고리즘을 컴퓨터가 알아들을 수 있는 언어로 작성하는 행위

프로그램: 프로그래밍으로 작성된 결과

프로그래밍 언어: 컴퓨터 언어(이진법)과 사람의 언어를 매개해주는 언어

                          컴퓨터 언어에 가까울 수록 Low Level(Assembly) <-> 사람의 언어에 가까울 수록 High Level(Java,C++,,)

컴파일: 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 바꾸는 과정(빌드에 포함)

빌드: 프로그램을 실행할 수 있는 파일로 만드는 것(exe, msi 등)

통합개발환경(Integrated Development Environment, IDE): 코드를 작성하고 디버깅, 빌드 등을 모두 할 수 있는 개발 환경

 

 

 

 

<웹 클라이언트와 웹 서버>

 

클라이언트: 사용자에게 보여지는 부분

서버: 클라이언트에게 데이터를 보내는 부분

2-Tier architecture : 클라이언트와 서버로 분리, '클라이언트-서버 아키텍쳐'라고도 함

3-Tier architecture : 2티어 아키텍쳐 + 데이터베이스(데이터 보관)

1 ··· 3 4 5 6