본문 바로가기
Java/자바공부

부트캠프가 끝난뒤...(1)

by 티코딩 2023. 4. 11.

 

6개월간의 부트캠프가 끝났다.

그간 나는 정말 많이 성장했을까? 싶어서 회고 겸 정리를 다시 해보자 한다.

section1부터 차근차근 보며 뭘했는지 적어보려고 한다.

 

ㅇ 웹 클라이언트와 웹 서버에 대해 배웠다.

client server architecture(2-tier architecture) 설계방식을 배웠었다. 간단히 리소스가 존재하는곳(서버)과 리소스를 사용하는 앱(클라이언트)을 분리시킨것이다. 여기서 리소스를 저장하는 공간을 따로 마련한곳(DB)을 추가하면 3-tier architecture.

 

ㅇ HTML과 CSS를 한번씩 써봤다.

 

ㅁ Java 기초를 배웠다.

 

4가지 특징을 배웠는데 이건 기억해 두고 가야할것같다. 내가 제일 많이 쓰는 언어기도 하니 외워두고 가야겠다.

1. 운영체제에 독립적이다.

이건 기억하고 있었다. JVM덕분에 특정 OS에서만 돌아가지 않는다는걸 알고있었는데, 자세히보니 JRE(JVM + 표준 클래스 라이브러리) 덕분이었다. 반만 알고있었다니...

2. 객체 지향 언어다.

이건 기본이라 알고있었다. 모든 기능을 객체로 만들어 사용한다. 객체지향적으로 프로그래밍하면 유지보수가 쉽고 확장성이 좋다. 아직까진 Java만 해봐서 객체지향적으로밖에 프로그래밍할줄 모르지만 다른것도 나중에 꼭 해보고싶다.

3. 함수형 프로그래밍 지원

이건 몰랐는데 Java8 부터 람다식과 스트림이 추가되었다고 한다. 이건 원래 있었던건 줄 알았다. 이제부터라도 알자! (람다식과 스트림은 사실 배웠는데 어떻게 쓰는지 까먹었다.)

4. 자동 메모리 관리

말해보라고 하면 몰랐지만, 자동 메모리 관리라고 하니 바로 생각난것이 가비지 컬렉터였다. 자바는 가비지 컬렉터를 실행시켜서 안쓰는 메모리를 수거한다. 자바짱짱맨!

 

ㅇ JVM(Java Virtual Machine) 에 대해 배웠다.

다시 보니 내가 알던건 일부에 불과했었다. 나는 OS에 상관없이 Java를 사용할 수 있게 하는건 줄 알았는데, 추가로 자바코드로 작성된 프로그램을 실행하는 프로그램이었다. 

 

ㅇ JRE(Java Runtime Environment)

JVM + 표준 클래스 라이브러리 - 위에서 말했음. 자바의특징 1번. Runtime - 실행과 관련 있음.

 

ㅇ JDK(Java Development Kit)

JRE + 개발도구 = OracleJDK와 OpenJDK가 있음. Development 개발과 관련 있음.

 

ㅇ 변수

변수는 나도 설명할 수 있다. 변수는 값을 저장하는 수단이다. 변수는 선언하고, 할당을 해야한다. 그리고 한번에 할 수 있다.

int a; //변수 선언
a = 1; //값 할당(초기화)
int b = 2; //선언과 할당을 한번에!

ㅇ 변수 명명 규칙

변수명은 카멜 케이스를 사용한다. 두번째 단어부터 대문자로 시작한다는 아주 간단한 규칙이다. 

int thCoding; 이런식이다.

그리고 영문자, 숫자, _ , $ 를 사용가능하고 대소문자 구분함. 숫자로 시작하면 안됨. 예약어를 사용할 수 없음. 

 

ㅇ 상수

항상 같아야 하는 데이터. 카멜 케이스가 아니라 스네이크 케이스를 사용함.

스네이크 케이스는 final double TH_CODING = 3.14;

이런식이다. 나도 프로젝트를 하며 상수를 사용했다. 내가 짠 코드에서는 

public class CalculatorHelper {
    private final static Double BMR_CONSTANT_MALE = 88.4;
    private final static Double BMR_CONSTANT_FEMALE = 447.6;
    private final static Double BMR_CONSTANT_WEIGHT_MALE = 13.4;
    private final static Double BMR_CONSTANT_HEIGHT_MALE = 4.8;
    private final static Double BMR_CONSTANT_AGE_MALE = 5.68;
    }

이런식으로 짰다.

변하지 않는 값들을 사용할 때 상수를 사용하면 유지관리가 쉬워진다!

 

ㅇ 타입

기본 타입과 참조 타입이 있다. 배울땐 참조타입을 이해 하지 못했는데(바보아님) 실제로 코드를 짜다보니 이해가 갔다.

기본타입은 정수(byte, short, int, long),실수(float, double),문자(char),논리(boolean) 타입이 있다. 그리고 값을 저장할때, 실제 값이 저장됨.

참조타입은 값을 저장할 때, 저장된 곳을 나타내는 주소값이 저장된다.  그냥 객체가 저장된다고 생각되면 편하다.

정수타입 - byte-1byte, short-2byte, int-4byte, long-8byte

실수타입 - float-4byte, double-8byte

논리타입 - boolean-1byte

문자타입 - char-2byte. 문자 한개 저장가능, 작은따옴표만 사용함. char letter = 'a';

 

ㅇ 문자열

큰따옴표로 감싸진 문자열.

String name = "kim taehyung";
String name2 = new String("kim taehyung");

이렇게 초기화 할 수 있다.

그리고 자바에서는 String 클래스로 지원하는 메서드들도 많다.

대표적으로 charAt(), compareTo(), concat(), indexOf(), trim(), toLowerCase(), toUpperCase()...

거의 다 알고리즘 문제를 풀다가 한번씩은 써봤던 경험이 떠오른다.

 

ㅇ 연산자

산술 연산자

+, -, *, /(몫), %(나머지)

알고리즘 문제를 풀며 생각보다 % 나머지 연산자를 자주 썼던것 같다.

증감 연산자 - 조건문에 자주 썼음.

num1 = num1 + 1; //이 식을
num1++;
++num1;// 2,3 처럼 하면 된다.

복합 대입 연산자

a = a + 2; //이 식을
a += 2; //이렇게 표현 가능하다!

비교 연산자

>, <, <=, >=

등가 비교 연산자

==, !=(같지않다) - 이거 은근많이썼음

논리 연산자

&&(and), ||(or)

 

ㅇ 조건문

if문

if(조건식){
	//조건식이 참이면 실행되는 코드
}

if else문

if(조건식1){
	//조건식1이 참이면 실행될 코드
}else if(조건식2){
	//조건식2가 참이면 실행될 코드
}else{
	//조건식1,조건식2 둘다 아닐때 실행될 코드
}

Switch문

String lotto = myInput.nextLine();

switch(lotto){
	case "1":
    	System.out.println("1번");
    	break;
    case "2":
    	System.out.println("2번");
    	break;
    case "3":
    	System.out.println("3번");
    	break;
    default:	//case가 없을경우
    	System.out.println("다른숫자" + lotto);
    	break;
        }

ㅇ 반복문

for문

int a = 0;	
for(int num = 0; num < 10; num++){	//for(초기화;조건식;증감식)
	a += num;
}
System.out.println(a);

향상된 for문

배열에서 하나씩 꺼낸다.

String[] names = {"태형","태훈","태현"};
for(String name : names){
	System.out.println(name + "천재");
    }

while문

int a = 0, sum = 0;
while(a <= 10){
	sum += a;
    	a++;
    }
    System.out.println(sum);

do-while문

while문은 조건문이 맞아야하지만, do-while문은 먼저 처음 한번은 실행한다는 점이 있습니다.

do{
	//실행문
    } while(조건식);

 

ㅇ 배열

여러개의 변수를 선언할때, 동일한 타입이다? --> 배열을 사용하자! 메모리 낭비를 방지할 수 있다. 참고로 배열은 참조타입!

int[] may = {1, 2, 3, 4, ..., 31};
int[] may = new int[31];	// 이렇게 선언과 초기화를 한번에 할수있다. 31개의 자리가 있는 배열

2차원배열

int[][] name = new int[5][2];

{
    {0,0},
    {0,0},
    {0,0},
    {0,0},
    {0,0}
}

가변 배열

(솔직히 얘는 진짜 까먹고있었다.)

int[][] ages = new int[3][];
ages[0] = new int[1];
ages[0] = new int[2];
ages[0] = new int[3];

//결과는?
Arrays.toString(ages[0]) = [0]
Arrays.toString(ages[0]) = [0, 0]
Arrays.toString(ages[0]) = [0, 0, 0]

ㅁ 객체지향 프로그래밍의 기초를 배웠다.

이건 정말 내가 자바를 하는 사람으로써 설명할줄 알아야지 싶었다.

 

ㅇ 클래스

클래스를 설명하는건 어딜찾아보든 다 비슷하다. 붕어빵의 틀 이라는데도 있고, 객체를 정의한 설계도 라고 하는곳도 있다. 사실 다 좋은 비유같다. 내가 생각하는 클래스는 객체를 만드는 틀 이다.

클래스의 구조를 보자

public class Example{
	int a = 1; // 필드
    void thisIsMethod(){...} // 메서드
    Example{...} //생성자
   }

구조는 저렇게 필드, 메서드, 생성자가 있다.

 

ㅇ 객체

객체를 설명할때 좋은 예시가 Car 클래스다.

자동차는 다양한 요소로 이루어져있다.

class Car{
	public static void main(String[]args){
    
    	Car benz = new Car();
        Car bmw = new Car();
        Car audi = new Car();
        }
       }

이런식으로 Car 클래스에 맞는 객체를 3개 생성했다. 

 

ㅇ 객체의 사용

public class CarEx{
	public static void main(String[] args){
    	Car benz = new Car("760", "black");
        benz.power();
        benz.accelerate();
        benz.stop();
        }
 }
 
 class Car{
 	public String model;
    public String color;
    
    public Car(String model, String color){
    	this.model = model;
        this.color = color;
        }
    void power(){
    	System.out.println("부릉");
        }
    void accelerate(){
    	System.out.println("부아앙");
        }
    void stop(){
    	System.out.println("끼익");
        }
    }

이렇게 객체.메서드; 각 객체별로 메서드를 사용할 수 있다.

 

ㅇ static

이 static은 처음 자바를 시작했을때 찾아봤던 개념인데 최근에 멘토님이 물어봤을때 정확하게 대답하지 못했던 것이다. 이번 기회에 정확하게 짚고 넘어가자!

static은 변수, 메서드 앞에 붙을 수 있다. static이 붙은 변수는 클래스 변수, 안붙은 변수는 인스턴스 변수 라고 부름. 메서드 내에 선언된 변수는 지역변수라고 부른다. 

static이 붙은 클래스 변수는 독립적인 저장 공간을 가지지 않고 공통된 저장공간을 가진다. 그리고 클래스변수는 new로 인스턴스를 따로 생성하지 않고, 바로 "클래스명.클래스변수명" 이렇게 사용가능하다. 

자바의 메모리 영역은

클래스 영역 - 스택 메모리 영역 - 힙 메모리 영역 이렇게 있는데.

클래스 변수는 클래스 영역에 저장되고, 스택 메모리 영역에 지역변수가 저장되고, 힙 메모리 영역에는 필드가 저장된다.

스택 메모리에서는 사용되지 않으면 자동으로 삭제된다.(가비지 컬렉터)

그리고 지역변수는 초기화를 시키지 않으면 오류가 난다. (처음 코드를 직접 짤때 오류가 나서 왜그러는거야? 했던 과거의 내가 생각난다..)

하지만 필드 변수는 초기화를 직접하지않아도 강제로 초기화가 이뤄진다.

 

ㅇ 메서드

public static int add(int a, int b){	//메서드 시그니처
	int result = a + b;	//메서드 바디
    return result;
    }
public static void multiply(int x, int y){
	int result = x * y;
    System.out.println(result);
    }

void가 없으면 무조건 return문이 있어야한다.

처음 코딩을 시작했을때 친구가 출력과 반환의 차이를 알려줬던게 생각이 난다. 

 

ㅇ 오버로딩(과적)

같은 메서드명을 쓰고, 매개변수의 개수나 타입이 달라야한다.

ㅇ 오버라이딩

부모클래스의 메서드를 자식클래스에서 상속받으면서 메서드를 재정의해서 사용하는걸 말한다.

 

ㅇ 생성자(Constructor)

이것도 기초중의기초이니 자신있게 설명할 수 있게 해보자!

객체를 생성할 때 new 키워드로 하는데 객체가 생성될때 호출되는 객체 초기화 메서드다.

생성자는 클래스명과 같아야하며, 리턴타입이 없으므로 void를 사용하지 않고, 오버로딩이 가능하다.

매개변수가 없는 생성자는 생성자가 없는 경우 자동으로 생성된다. 

생성자로 객체별로 필요한 매개변수를 설정해줄 수 있어 편하다.

 

ㅁ 객체지향 프로그래밍의 심화를 배웠다.

ㅇ 객체지향 프로그래밍의 4가지원칙

상속 / 캡슐화 / 다형성 / 추상화

정보처리기사 공부할때 캡상추다 라고 외웠던기억이 난다.

모두 너무나도 중요한 개념이니 한개한개 araboza.

 

ㅇ 상속

상속은 부모 클래스를 자식클래스가 확장한다고 보면 된다. 자식클래스는 항상 부모클래스와 비교했을 때, 같거나 많아야한다. 

상속을 하는 이유는 코드를 재사용하기 때문에 적은 코드로 새로운 클래스를 작성할수 있어 코드의 중복을 제거할 수 있다. 

하나의 객체가 여러가지로 표현될 수 있다는걸 다형성이 있다고 하는데, 상속으로 인해 객체의 다형성을 표현할 수 있다.

 

자바에서 상속은

Person 이라는 클래스를

class Teacher extends Person{

}

이렇게 상속할 수 있고, 상속하게 되면 Person에있는 메소드를 재정의해서 사용하거나 그대로 사용할 수 있다.

그리고 자바에서는 다중상속이 불가능하다!

 

ㅇ 포함관계

사실상 상속보다는 나도 코드를 짜면서 느끼지만 포함관계를 정말 많이쓴다.

public class Programmer{
	int id;
    String name;
    Address address; // !!!포함관계!!!
    
    ...
    }
    
class Address {
	String city, country;
    
    public Address(String city, String country){
    	this.city = city;
        this.country = country;
        }
        
     }

주석처리한 부분을 보면 Address 클래스를 포함한다. 언제 상속을 쓰고, 언제 포함관계를 사용할까??

-> ~은 ~이다 관계면 상속, ~은 ~을 가지고 있다 관계면 포함관계!

참 쉽죠?

so ez

ㅇ super, super()

super는 상위클래스의 객체, super()는 상위클래스의 생성자를 호출하는 것을 의미함.

부모클래스의 count라는 변수가 있고, 자식클래스에도 count라는 변수가 존재할 때, 

this.count 하면 현재클래스의 count가 호출되고,

super.count하면 부모클래스의 count가 호출된다.

 

super() 도 this()와 마찬가지로 부모클래스의 생성자를 호출한다.

 

캡슐화

캡슐화는 말그대로 특정 객체안에 속성과 기능들을 하나의 캡슐로만들어 데이터를 외부로부터 보호하는것을 의미한다.

캡슐화를 통해 정보은닉을 달성할 수 있다. 코딩을 처음 접했을 때, 정보은닉이 왜 필요하지? 했었다. 철이 없었다.

정보 은닉이 필요한 이유는 외부로부터 객체가 함부로 변경되어 다른곳에서 문제가 발생할 수 있기 쉽기 때문이다. 캡슐화를 통해 유지보수, 코드 확장에도 오류를 최소화 할 수 있다!

 

ㅇ 패키지

패키지는 하나의 디렉터리고, 그 패키지에 속한 클래스, 인터페이스, 파일들은 패키지에 속해있어야한다. 여기서 계층구조는 .(점)으로 구분된다.

아래는 내 코드의 일부를 가져와봤다.

package sixman.helfit.domain.map.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

코드를 보면, sixman의 helfit 아래에 domain 아래의 map 아래의 controller 디렉토리 안에 있는 파일임을 알 수 있다.

그리고 밑의 import들은 다른 패키지 내의 클래스를 사용하기 위해 작성한것이다.

 

ㅇ 접근제어자

클래스 외부로의 굳이 필요하지 않은 노출을 막기 위해 사용한다. 이것도 왜 쓰지? 굳이? 라고 했던 과거의 나 반성해.

코드를 직접 짜보니 이것도 역시 위에서 말한 이유와 마찬가지다. 외부로 불필요한 데이터를 노출시키지 않고, 변경되지 않게 하기 위해서였다. 

접근제어자는 기.본.적.으.로 알아야 하니 정리해놓겠다.

private - 동일클래스에서만 접근가능

default - 동일 패키지 내에서만 접근가능(접근제어자 아무것도 안쓰면 기본이 default로 생성됨)

protected - 동일패키지 + 다른 패키지의 하위 클래스에서 접근가능

public - 접근 제한 없음

코드는 본이이 짜는 거니 접근제어자를 잘 사용해야 한다. 데이터마다 어디까지 사용될지는 본인이 알아야 하므로 잘 정해서 쓰자!

 

ㅇ getter/setter

접근제어자가 private일 때, 변수의 데이터 값을 추가하거나 수정하고 싶을때 사용한다. 이 전 게시물에서 내가 setter 대신 builder를 사용하는 이유와 사용법을 포스팅했다. 참고해주길 바래요. (맥에서 cmd + n 키를 쓰면 편하게 만들수 있음^^)

class Student{
	private String name;
    private int age;
    private int id;
    
    public String getName(){
     return name;
    }
    public void setName(String name){
     this.name = name;
    }
    ...
    }
    
public class GetterSetter {
	public static void main(String[] args){
    	Student s = new Student();
        s.setName("태형킴");
        s.setAge("28");
        s.setId("3");
        }
}

이렇게 객체의 속성을  보호하면서 하나하나 설정해줄 수 있다.

 

ㅇ 다형성

자바에서는 한 타입의 참조 변수를 통해 여러타입의 객체를 참조할 수 있도록 만든 것이다.

이게 무슨소리냐, 하면 ....

 

2편에서 계속쓰겠습니다^^

'Java > 자바공부' 카테고리의 다른 글

부트캠프가 끝난뒤...(5)  (0) 2023.05.11
부트캠프가 끝난뒤...(4)  (0) 2023.05.03
부트캠프가 끝난뒤...(3)  (0) 2023.04.27
부트캠프가 끝난뒤...(2)  (0) 2023.04.26
setter 대신 builder  (0) 2023.04.09