본문 바로가기
CS/자바

[JAVA] 기초

by Hoozy 2023. 3. 7.

이전 게시글 네트워크 2

https://hoozy.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-2

 

[백엔드] 네트워크 2

이전 게시글 네트워크 1 https://hoozy.tistory.com/entry/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-1 카테고리 : 네트워크 쿠키와 세션 쿠키 : HTTP의 일종으로 사용자의 컴퓨터에 저장하는 작은 기

hoozy.tistory.com

수많은 언어가 있지만, 저는 자바를 하기 때문에 자바에 대해서 공부한 후

나중에 나머지 언어들도 공부하겠습니다.

카테고리 : 자바(기초)

JAVA
  • 썬에서 개발한 객체지향 언어이다. (객체지향은 아래에서 자세히 다루겠습니다.)
  • 현재 IT 기술 전반에서 가장 널리 사용하는 프로그래밍 언어이다.
  • 장점
    1. 간결하면서도 강력한 객체지향 언어이다.
    2. 개방형 구조로 여러 기술과 융합 가능.
    3. 플랫폼에 독립적으로, 여러 운영체제나 하드웨어에서도 동일하게 실행한다.
    4. 많은 오픈소스 프레임워크로 생산성을 증가하고 유지보수 비용을 절감할 수 있다.
  • 단점
    1. 처리 속도가 중요한 애플리케이션에는 적합하지 않다.
    2. GUI 요소가 많은 MS 윈도우 응용 프로그램 개발에는 적합하지 않다.
      3, 하드웨어에 연결하여 제어할 수 없기 때문에(JVM 이용) 직접 하드웨어를 정밀하게 조정해야 하는 프로그램 개발에는 적합하지 않다.
JVM (자바 가상 머신)
  • 자바 프로그램 실행환경을 만들어 주는 소프트웨어.
  • 자바 코드를 컴파일하여 .class 바이트 코드로 만들어 이 코드가 자바 가상 머신 환경에서 실행된다.
  • JVM은 JRE(자바 실행 환경)에 포함되어 있고, 운영체제에 맞는 JRE(JVM)가 설치되어 있다면 바이트 코드는 어느 OS에서든 실행이 가능하다.
자바 프로그램의 실행 과정
JDK / JRE
  • JDK (자바 개발 키트) : 자바 프로그램 개발에 필요한 구성 요소.
  • JRE (자바 개발 환경) : 자바 프로그램 실행에 필요한 구성 요소.

아래부터는 기본 문법을 배워보겠습니다.

자료형
  • 기본 자료형
자료형 데이터 크기 표현 가능 범위
boolean 참과 거짓 1바이트 true, false
char 문자 2바이트 유니코드 문자
byte 정수 1바이트 -128 ~ 127
short 정수 2바이트 -32,768 ~ 32,767
int 정수 4바이트 -2,147,483,648 ~ 2,147,483,647
long 정수 8바이트 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float 실수 4바이트 +-(1.40 * 10^(-45) ~ 3.40 * 10^38)
double 실수 8바이트 +-(4.94 * 10^(-324) ~ 1.79 * 10^308)
  • 변수 선언
    • 기본 자료형 이름 + 변수 명;
      int a;
    • 변수 초기화
      a = 1;
    • 변수 이름 규칙
      • 길이는 제한이 없다.
      • 문자, '_', '$' 로만 시작해야한다.
      • 자바의 연산자(+,-,*,/)는 변수 이름에 넣을 수 없다.
      • 대소문자를 구분한다.
      • 이름 사이에 빈칸을 넣을 수 없다. 빈칸 대신 '_'를 사용한다.
      • 자바의 키워드는 변수 이름으로 선언 불가하다.(this 등)
  • 연산자
    • 피 연산자의 개수에 따라 단항, 이항, 삼항 연산자라고 부른다.
      • 피 연산자 : 연산자에 연산을 당하는 대상.
    • 산술 연산자
      • / : 이항 연산자. 두 수를 나눈 몫을 구한다.
      • % : 이항 연산자. 두 수를 나눈 나머지를 구한다.
      • += : 좌변과 우변을 더한 값을 좌변에 대입한다.
      • -= : 좌변에서 우변을 뺀 값을 좌변에 대입한다.
      • %= 좌변에서 우변을 나눈 나머지를 좌변에 대입한다.
      • ++ : 단항 연산자. 변수 값을 1 증가.
      • -- : 단항 연산자. 변수 값을 1 감소.
    • 관계 연산자
      • == : 이항 연산자. 왼쪽과 오른쪽 항이 같으면 참, 아니면 거짓.
      • != : 이항 연산자. 왼쪽과 오른쪽 항이 다르면 참, 아니면 거짓.
    • 논리 연산자
      • && : 이항 연산자. 두 항의 논리 값이 참이면 참, 아니면 거짓.
      • || : 단항 연산자. 두 항의 논리 값 중 하나 이상의 항이 참이면 참, 아니면 거짓.
      • ! : 단항 연산자. 연산되는 항이 참이면 거짓, 거짓이면 참.
      • [조건식] ? [true] : [false] -> 조건식의 결과가 참일 때 [true] 항이 수행되고, 거짓이면 [false] 항을 수행한다.
  • 참조 자료형 : 위에 기본 자료형 빼고 모든 자료형. ( EX) 클래스, 배열, 열거, 인터페이스. 문자열 등)
    • 배열
      • 배열은 크기를 지정하면 고정된 크기를 갖는다. 이 점 때문에 배열 보다는 ArrayList라는 컬렉션을 많이 쓴다.
      1. 배열 변수명 선언
        int arr[];
      2. 배열 생성 (크기 지정도 이 때 해준다.) -> 선언과 생성을 동시에 할 수 있다.
        arr = new int[5]; -> int arr[] = new int[5];
      3. 초기화 (배열에 값 넣어주는 것)
        arr[0] = 1;
조건문 (if , switch )
  • if 문
if(조건문) { 
// 위 조건문이 참이면 실행되는 문 
} else if (조건문) { 
// 위 조건문이 참이면 실행되는 문 
} else { 
// 위에 조건문 들이 다 거짓일 경우 실행되는 문 
}
  • switch 문
    • 만약 기준 변수가 조건 2에 만족하면 조건 2부터 아래로 다 실행된다.
    • break : break 문 까지만 switch 문이 실행됨.
    switch(기준 변수) { 
    case 조건1 : //기준 변수가 조건1을 만족하면 실행되는 문. 
    case 조건2 : //기준 변수가 조건2을 만족하면 실행되는 문. 
    case 조건3 : //기준 변수가 조건3을 만족하면 실행되는 문. break; 
    default : //기준 변수가 조건 1,2,3을 다 만족 안하면 실행되는 문. 
    }
반복문 (for, for each, while, do-while)
  • 반복문은 break로 반복문을 바로 종료할 수 있다. continue로 현재 진행 상황 상관 없이 다음 조건을 실행한다.
  • for 문
for (int i = 0; i < 10; i++) { 
// i가 0부터 10보다 작은 9까지 ++(1씩 증가) 반복한다. 
}
  • for each 문
int[] num = {"1", "2", "3"}; 
for (int n : num) { 
// num의 원소들을 왼쪽부터 순서대로 반복한다. -> 배열, 리스트 등에서 사용 
}
  • while 문
while (조건문) { 
// 조건문이 거짓일 때까지 반복한다. 
}
  • do - while 문
do { 
// 바로 실행되는 문 -> 아래 조건문이 거짓일 때까지 do 문이 실행됨. 
} while (조건문);
클래스
  • 객체의 속성을 한 곳에 정의해 놓은 것.
  • 객체의 속성은 필드, 메소드, 생성자 등이 있다.
인스턴스(객체)
  • 클래스로부터 만들어진 객체.
  • 아래에서 Phone 은 클래스, galaxy를 인스턴스라고 한다.
class Phone { 
    String model; 
    String color; 
    int price; 
}

public class Main {  
    public static void main(String\[\] args) {  
        Phone galaxy = new Phone();  
        galaxy.model = "갤럭시S10";  
        galaxy.color = "검정색";  
        galaxy.price = 100;  
    }  
}
메소드
  • 어떠한 작업을 수행하는 코드를 하나로 묶어 놓은 것. 함수 라고도 한다.
public int add(int x, int y) { // 접근 제한자 + 반환 타입 + 메소드 이름 (타입 변수명, 타입 변수명) {  
int result = x + y; // 내부 로직 }  
return result;  
}
생성자
  • 인스턴스가 생성될 때 사용되는 인스턴스 초기화 메소드.
  • 해당 클래스의 인스턴스가 생성될 때 (new 키워드로 생성) 자동으로 호출되는 메소드.
  • 대표적으로 인스턴스의 변수를 초기화하는 용도의 생성자가 있다.
  • 생성자의 이름은 클래스 명과 같아야 하며, 리턴 값이 없고, 오버 로딩이 가능하다.
  • 클래스를 선언할 때 따로 선언하지 않아도 매개변수와 내용이 없는 디폴트 생성자가 생성되지만, 디폴트 생성자를 제외한 생성자가 하나라도 있으면 디폴트 생성자는 따로 생성하지 않으면 생성이 안된다.
class Phone {  
    String model;  
    String color;  
    int price;

    public Phone() { // 디폴트 생성자  
    }
}
접근 제한자
  • public : 접근 제한이 없음.
  • private : 같은 클래스 내에서만 접근이 가능.
  • protected : 같은 패키지(폴더) 내 클래스, 상속 관계인 클래스만 접근 가능.
  • default : 같은 패키지 내 클래스만 접근 가능.
패키지
  • 클래스의 묶음.
  • 클래스 혹은 인터페이스를 포함시킬 수 있으며, 관련된 클래스끼리 묶음으로써 클래스를 효율적으로 관리할 수 있다.
객체지향 (OOP)
  • 객체 : 모든 실재하는 대상
  • 객체지향 : 객체들의 특징을 정의하고, 객체들 간의 상호작용으로 프로그램을 개발하는 것.
  • 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다.
  • 특징 4가지
    1. 추상화 : 시믈이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것
      • 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
    2. 상속 : 기존의 클래스(부모 클래스)를 재활용하여 새로운 클래스(자식 클래스)를 작성하는 자바의 문법 요소.
    3. 다형성 : 객체의 속성이나 기능이 상황에 따라 여러 형태를 가질 수 있는 성질.
    4. 캡슐화 : 클래스를 접근 제한자인 private를 활용해 외부에서 접근, 제어를 못하게 캡슐화 하는 것.
      • 정보은닉 특징을 가지고 있어, 클래스의 연산(getter, setter)을 통해서만 접근이 가능하다.
객체지향의 설계원칙
  • SOLID
  원칙명 설명
SRP 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다.
OCP 개방-폐쇄 원칙 확장에는 열려 있고, 수정에는 닫혀 있어야 한다.
LSP 리스코프 치환 원칙 상위 타입은 항상 하위 타입으로 대체할 수 있어야 한다.
ISP 인터페이스 분리 원칙 인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스 보다 여러 개의 구체적인 인터페이스가 낫다.) SRP와 같은 문제에 대한 두 가지 다른 해결책이다.
DIP 의존관계 역전 원칙 구체적인 클래스보다 상위 클래스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라. DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.
상속
  • 클래스 명 뒤에 extends 부모 클래스 명 {} 으로 작성한다.
  • 부모 클래스에서 정의된 필드와 클래스를 물려 받는다.
  • 부모 클래스에서 물려 받은 메소드를 수정할 수 있다.
  • super, super() 메소드
    • super : 부모를 가르키는 참조 변수.
      • 부모 클래스 내의 변수를 참조.
    • super() : 부모의 생성자를 호출하는 메소드.
      • 일반 클래스 호출처럼 만약 부모의 디폴트 생성자가 없고, 오버로딩된 부모의 생성자가 있으면 디폴트 생성자를 접근 못하기 때문에 super()은 못쓰고, 오버로딩된 부모의 생성자의 매개변수 조건과 같게 super(매개변수) 메소드를 사용해야 한다.
  • this, this() 메소드
    • this : 현재 속한 클래스를 지칭.
    • this() : 현재 속한 클래스의 다른 생성자를 호출할 때 사용.
오버로딩 / 오버라이딩
  • 오버로딩 : 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것.
    • 메소드의 이름이 동일해야 하고, 매개변수의 개수와 타입이 다 달라야한다.
  • 오버라이딩 : 부모 클래스로부터 상속 받은 메소드의 내용을 변경하는 것.
    • 단, 부모 클래스의 메소드의 이름, 매개변수, 반환타입이 같아야한다.
추상 클래스 / 인터페이스
  • 추상 클래스 : 추상 메소드를 선언할 수 있는 클래스. 상속받는 클래스 없이 그 자체로 인스턴스 생성 불가. 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스.
    • 추상 메소드 : 구현부 없이 선언된 미완성 메소드. 자식 클래스가 무조건 오버라이딩하여 구현부를 작성해야 한다.
    abstract class Bird { // 추상 클래스 
        abstract boolean flyable(int a); // 추상 메소드 
    }
  • 인터페이스 : 객체의 특정 행동의 특징을 정의하는 간단한 문법. 멤버를 가지지 못하고, 메소드만 정의할 수 있다. 메소드는 내용을 가질 수 없다. 인터페이스를 구현하는(상속받는) 클래스는 인터페이스에 존재하는 함수의 내용을 반드시 구현해야한다.
interface Flyable { // 인터페이스 
    void fly(int a, int b, int c); // 추상메소드
} 

// 인터페이스는 implements를 사용하여 상속 받는다. 
class Pigeon implements Flyable { 
    private int a, b, c; 

    @Override 
    public void fly(int a, int b, int c) { // 무조건 사용해야 함. 
        this.a = a; 
        this.b = b; 
        this.c = c; 
    } 
}
추상 클래스 / 인터페이스 차이점
  추상클래스 인터페이스
내부메소드 추상메소드 필수 아님 추상메소드만 가능
다중 상속 여부 불가능 가능
구현 방법 extends implements
특성 기능을 재사용, 확장한다는 측면에서 상속성을 지님 같은 이름의 메소드가 클래스에 따라 다르게 동작하도록 구현되는 특성인 다형성을 지님
예외 처리
  • 목적
    1. 예외의 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해서
    2. 개발자에게 알려서 코드를 보완할 수 있도록 하기 위해서
  1. try-catch(-finally) 형식
    • 자원을 닫을 때 close()를 사용해야 함.
    try { 
    // 예외가 발생할 수 있는 코드 
    } catch (Exception e) { 
    e.printStackTrace(); // 에러의 이름이 출력되는 코드 
    // 예외가 발생했을 시 실행되는 코드 (catch는 여러개 작성 가능) 
    } finally { 
    // 예외의 발생여부 상관없이 항상 실행되는 코드 
    }
  2. try-with-resource 형식
    • try문을 벗어나는순간 자동적으로 close() 호출.
    // ()괄호 안에 입출력 스트림을 생성하는 로직을 작성할 때 해당 객체가 AutoClosable 인터페이스를 구현한 객체여야 합니다. 
    try (FileOutputStream out = new FileOutputStream("test.txt")) { 
        out.write("Hello".getBytes()); 
            out.flush(); { 
    catch (IOException e) {}
  3. 메소드에서의 예외 선언
    • catch문을 이용해서 예외 처리를 하지 않은 경우, 메소드에 throws로 예외를 발생할 수 있다는 것을 알려줘야 한다.
    void method() throws IOException {}

JAVA 기초 끝.

다음 게시글 JAVA 심화 1

https://hoozy.tistory.com/entry/JAVA-%EC%8B%AC%ED%99%94-1

 

[JAVA] 심화 1

이전 게시글 JAVA 기초 https://hoozy.tistory.com/entry/JAVA-%EA%B8%B0%EC%B4%88 카테고리 : 자바(심화) 컬렉션 1. List 인터페이스 정렬된 모든 객체 컬렉션을 저장할 수 있는 목록 데이터 전용. ArrayList 동작 배열

hoozy.tistory.com

참고 자료

https://velog.io/@rlafbf222/JAVA-%EA%B8%B0%EC%B4%88-%EB%AC%B8%EB%B2%95-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

https://travelbeeee.tistory.com/338

'CS > 자바' 카테고리의 다른 글

[JAVA] 프레임워크  (0) 2023.03.10
[JAVA] 심화 2  (0) 2023.03.10
[JAVA] 심화 1  (0) 2023.03.08

댓글