본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

Personal/Book

Do it! 자바 완전 정복

김동형

 

 

프로그래밍 언어는 컴퓨터가 이해할 수 있는 명령을 작성하기 위한 도구를 말한다. 

 - 고급언어: c, c++, 자바emd

 - 기계어: 2진 데이터로 구성되 컴픁처가 직접 알아들 을 수 있다. 

 - 어셈블리어: 고급언어와 기계어 사이. 1대1로 대응되는 언어. 굳이 따지면 기계어에 가깝다. 

 

컴퓨터가 고급언어를 이해하는 과정이 필요하고, 이 과정을 수행하는 것이 컴파일러. 

 

자바

1991년 가전 제품의 셋톱용 프로그램으로 만든 오크가 인터넷이 빠르게 발전하면서 인터넷 환경에 적용할 수 있도록 개발방향을 바꾼것이 자바의 시작이다 . 자바라는 이름 자체에 특별한 의미가 없다. 여러 단어중 무작위로 선택한 값.

1995년 핫자바라는 웹브라우저로 자바를 개발해 발표했다. 이듬해 1996년 자바 1.0 정식발표했다. 

https://standout.tistory.com/107

 

자바는 무슨뜻일까?

자바 인도네시아의 커피가 유명한 자바 섬 자바 언어의 로고는 인도네시아 섬의 커피를 상징 https://namu.wiki/jump/XZBM2sJcuDnoqqgnv%2F34499xk3Jg1xumXypm8tvPtpvcMgQWGZdOVcR134XHEY8A 파일:자바섬.png - 나무위키 이미

standout.tistory.com

 

 

자바의 좌우명

write once, run anywhere 한번 작성하면 어느 플랫폼에서나 실행된다. 

플랫폼 종속성의 대표적인 예로는 윈도우, 맥, 리눅스 운영체제의 대표적인 실행파일 .exe, .app, .sh를 들 수 있고 실행파일을 일종의 기계어 집합이다. 윈도우 .exe 파일은 윈도우 외 다른 플랫폼에서 동작하지않고 맥과 리눅스도 그들의 플랫폼에서만 실행된다. 이러한 특징을 플랫폼 종속성이라고 하며 하나의 실행파일은 하나의 특정 플랫폼에서만 실행할 수 있다는 것을 의미한다. 

하나의 프로그램이 모든 플랫폼에서 실행 가능할때 플랫폼 독립성이 있다고 말한다. 

이는 자바 가상 머신 덕분이다. JVM

https://standout.tistory.com/17

 

JDK JRE JVM의 차이

로봇이 인간언어를 해석하기까지 과정을 상상해보자. 로봇(JVM)은 자신에게 깔린 여러서비스(JDK) 중 탑재된 언어해석기(JRE)를 통해 언어를 읽어 이해할 수있다. JDK ⊃ JRE ⊃ JVM, JVM은 JRE의 라이브

standout.tistory.com

 

 

 

jdk 자바를 이용해 프로그램 개발을 하는데 필요한 도구를 모아 둔 집합.

jre 자바 개발 환경.

https://standout.tistory.com/328

 

Eclipse 자바로 실행하기, console 출력하기

'main메소드가 있는 java 파일에서' 오른쪽 마우스 - run as - java application

standout.tistory.com

https://standout.tistory.com/1141

 

자바의 정석 Chapter01: 자바를 시작하기 전에

자바 Sun Microsystems에서 개발한 객체지향 프로그래밍언어 자바의 중요한 장점, "Write once, run anywhere" https://standout.tistory.com/14 객체와 객체지향프로그래밍 OOP 객체 Object 객체는 깔끔하게 정의내리기

standout.tistory.com

 

 

자바소스의 실행과정은 소스파일.java 작성 .바이트 코드 .class 생성으로 컴파일이 자동으로 수행되고 jvm은 메모리를 할당받아 자바프로그램을 실행한다. 

자바 가상 머신은 메모리를 효율적으로 관리하기 위해 메모리를 메서드 영역, 스택영역, 힙영역으로 나눠 사용한다. 

메모리 할당 뒤 실행 파일 바이트 코드는 메서드 영역에 로딩되며 클래스내 포함되있는 main()메서드를 실행하는 것이 자바 가상 머신의 역할. 즉 main()은 시작이자 끝.

메서드 구성중 public은 접근 지정자, static은 정적 메서드를 나타내는 키워드이다. public static한 메서드 

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

https://standout.tistory.com/72

 

운영체제와 대화하는 main 메소드

main 메소드 운영체제와 대화하는 역할 진입점, 프로그램이 실행될 때 가장 먼저 호출되는 메소드 public class Example { public static void main(String[] args) { // 실행할 코드 블럭 System.out.println("Hello, World!");

standout.tistory.com

https://standout.tistory.com/104\

 

JAVA 예약어 static

static 예약어 데이터영역 메모리에 생성되어 프로그램이 종료될때까지 수명이 유지된다. 클래스 이름으로 바로, 직접 호출하여 프로그램이 종료될때까지 값을 여기저기 공유하여 저장할 수 있

standout.tistory.com

 

 

1개의 소스차일에는 여러개의 클래스 파일이 포함될 수 있고. 

소스파일명은 반드시 클래스명과 같아야한다. 

하나의 자바 소스파일에 클래스가 여러개면 public이 붙은 클래스와 이름을 일치시킨다. 

바이트 코드는 파일단위가 아닌 클래스단위임으로 4개의 클래스가있다면 4개의 바이트 코드 파일이 생성된다. 

https://standout.tistory.com/100

 

클래스와 인터페이스의 구성

앞서 클래스와 인터페이스의 차이를 간단히 확인해봤다. 이제 클래스와 인터페이스의 구성하는 각각의 요소를 확인해보자. https://standout.tistory.com/85 JAVA Interface, 인터페이스 Class와의 차이 인터

standout.tistory.com

 

 

// 주석

/*긴 주석*/

 

 

 

 

콘술출력메서드, 문자열출력

print 출력 줄바꿈미포함

println 기본 줄바꿈포함 \n

printf 형식지정 출력

public class Main {
    public static void main(String[] args) {

        // 1. println() : 출력 후 줄바꿈
        System.out.println("안녕하세요");
        System.out.println("자바 공부 중입니다.");

        // 2. print() : 출력 후 줄바꿈 없음
        System.out.print("Hello ");
        System.out.print("Java");
        System.out.println(); // 줄바꿈

        // 3. 변수 선언
        String name = "홍길동";
        int age = 20;
        double height = 175.5;

        // 4. 문자열 연결 출력
        System.out.println("이름: " + name);
        System.out.println("나이: " + age);
        System.out.println("키: " + height);

        // 5. printf() 형식 지정 출력
        System.out.printf("이름: %s, 나이: %d세, 키: %.1fcm%n",
                name, age, height);

        // 6. 여러 자료형 출력
        char grade = 'A';
        boolean pass = true;

        System.out.println("등급: " + grade);
        System.out.println("합격 여부: " + pass);

        // 7. 계산 결과 출력
        int a = 10;
        int b = 20;

        System.out.println("합계: " + (a + b));
        System.out.println("차이: " + (b - a));
        System.out.println("곱: " + (a * b));
        System.out.println("나눗셈: " + (b / a));

        // 8. printf 계산 결과 출력
        System.out.printf("%d + %d = %d%n", a, b, a + b);
    }
}

 

 

 

 

 

 

c, 자바 같은 컴파일 언어는 변수를 사용하기 전에 반드시 자료형을 선언해야한다. 

변수의 자료형을 선언할때는 변수 이름 앞에 자료형을 표기해야한다 .

변수는 선언과함께 값을 대입할 수도 있고, 값없이 자료형만으로 지정후 이후에 부여할 수 있다. 

public class Main {
    public static void main(String[] args) {

        int age = 20;              // 정수
        double height = 175.5;     // 실수
        char grade = 'A';          // 문자
        boolean pass = true;       // 논리값
        String name = "홍길동";     // 문자열

        System.out.println(age);
        System.out.println(height);
        System.out.println(grade);
        System.out.println(pass);
        System.out.println(name);
    }
}
int age = 20;
int age;      // 변수 선언
age = 20;     // 값 대입

https://standout.tistory.com/127

 

자바의 자료구조, collection

컬렉션 프레임웍이란 데이터 군을 저장하는 클래스들을 표준화한 설계. 컬렉션 프레임웍은 컬렉션, 다수의 데이터를 다루는데 필요한 풍부한 클래스들로 프로그래머의 짐을 덜어준다. 재사용

standout.tistory.com

https://standout.tistory.com/1146

 

자바의 정석 Chapter02: 변수

변수 변수초기화란 변수를 사용하기 전에 처음으로 값을 저장하는 것을 의미. 변수는 대소문자가 구분되며 길이에 제한이 없으나 예약어를 사용하거나 숫자로 시작해서는 안되며 특수문자는 _

standout.tistory.com

 

 

 

 

변수지정시 영문 대소문자와 한글 사용불가. 

_와 $만 사용할 수 있다. 숫자사용가능하나 첫번째 글자로는 사용할 수 없다. 

자바에서 사용하는 예약어는 사용할 수 없다 .

변수명을 지을때는 소문자로 시작하고 2개 이상 결합할때는 새로운 단어의 첫글자를 대문자로 하면 좋다. 

변하지않는 상수값을 지정할때는 변수와 구분하기 위해 모두 대문자로 표기한다. 다만 단어가 여러개인 경우 가독성이 떨어짐으로 _를 사용한다.

메모리에 변수가 만들어진 이후 닫힌 중괄호를 만나면 메모리에서 삭제된다. 

public class Main {
    public static void main(String[] args) {

        // 1. 변수명은 영문자, _, $ 사용 가능
        int age = 20;
        int _count = 10;
        int $money = 5000;

        // 2. 숫자는 사용할 수 있지만 첫 글자로는 사용 불가
        int age1 = 20;
        int student2 = 30;

        // int 1age = 20;     // 오류
        // int 123num = 10;   // 오류

        // 3. 예약어는 변수명으로 사용 불가
        // int class = 1;     // 오류
        // int public = 2;    // 오류
        // int if = 3;        // 오류

        int classNum = 1;
        int publicCount = 2;

        // 4. 변수명은 소문자로 시작하고 여러 단어는 Camel Case 사용
        int studentAge = 20;
        String userName = "홍길동";
        double averageScore = 95.5;

        // 5. 상수는 final 사용, 모두 대문자로 작성
        final double PI = 3.14159;
        final int MAX_SIZE = 100;
        final String COMPANY_NAME = "OpenAI";

        // 출력
        System.out.println("나이: " + age);
        System.out.println("학생 나이: " + studentAge);
        System.out.println("이름: " + userName);
        System.out.println("평균 점수: " + averageScore);
        System.out.println("원주율: " + PI);
        System.out.println("최대 크기: " + MAX_SIZE);
        System.out.println("회사명: " + COMPANY_NAME);
    }
}

https://standout.tistory.com/89

 

변수선언이란?

변수선언이란 컴퓨터의 메모리 공간을 할당해 어떠한 값을 *잠시 저장하는 것을 말한다. 필요에 따라 값을 변경 할 수 있고 프로그램에서 계속해서 사용된다. *프로그램이 종료되면 메모리는 사

standout.tistory.com

https://standout.tistory.com/13

 

상수, 변하지 않는 값

상수(constant) 변하지 않는 값, 변하는 값 변수와 반대 개념이다. https://standout.tistory.com/12 변수, 정수 실수 문자 주소값 배열 클래스 변수란 어떤 '변하는 값'을 저장하기 위한 이름을 가진 공간이

standout.tistory.com

 

 

 



 

 

자바의 자료형은 크게 기본자료형과 참조자료형으로 나뉜다. 

자바에는 8가지 기본 자료형이 있으며 이외의 모든 자료형은 참조자료형이라고 본다. 

기본 자료형의 이름은 소문자로 시작하고 참조자료형은 대문자로 시작한다. 

기본 자료형은 스택 메모리에 실제 변수값을 저장하고 참조자료형은 데이터값은 힙메모리에, 스택메모리의 변수공간에는 위칫값을 저장한다.

byte 1Byte (8bit) -128 ~ 127
short 2Byte (16bit) -32,768 ~ 32,767
int 4Byte (32bit) -2,147,483,648 ~ 2,147,483,647
long 8Byte (64bit) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float 4Byte (32bit) 약 ±3.4 × 10³⁸
double 8Byte (64bit) 약 ±1.7 × 10³⁰⁸
char 2Byte (16bit) 0 ~ 65,535 (유니코드 문자 1개)
boolean JVM 의존 (보통 1Byte 취급) true, false

https://standout.tistory.com/96

 

자료구조, 선형과 비선형

자료 구조 자료 구조는 데이터 값의 모임, 또 데이터 간의 관계를 의미한다. https://ko.wikipedia.org/wiki/%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0 자료 구조 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두

standout.tistory.com

https://standout.tistory.com/56

 

자바 기본타입 (bsilfdcb)

외워보자. bsil fd cb 비실한 fd가 시비를 건다. 자바에서 값을 표현할때 데이터 타입으로 정수, 실수, 논리형을 가진다. 위 표를 봐보자, 최소단위 byte는 1byte로 8bit를 가지고 있고, 256자리를 표현, -1

standout.tistory.com

 

 

 

 

 

 

 

float, double 자료형은 int, long과 같지만 저장할 수 있는 값의 범위는 훨씬 넓다. 

https://standout.tistory.com/12

 

변수, 정수 실수 문자 주소값 배열 클래스

변수란 어떤 '변하는 값'을 저장하기 위한 이름을 가진 공간이다. '상수' 와는 반대개념이다. https://standout.tistory.com/13 상수, 변하지 않는 값 상수(constant) 변하지 않는 값, 변하는 값 변수와 반대

standout.tistory.com

 

 

 

boolean을 제외한 기본자료형 7개는 자료형을 서로 변환할 수 있다. 이를 타입변환이라한다. 

컴파일러가 자동으로 수행하는 타입변화은 자동타입변환, 개발자가 직접 타입변환을 수행하는 경우 수동 타입변환이라한다 .

작은 자료형을 큰 자료형에 담으면 어떠한 데이터 손실도 발생하지않음으로 컴파일러가 자동으로 타입변환을 실행한다 .

이를 업캐스팅이라고 한다.

업캐스팅이 아니더라도 byte, short 자료형에 저장할 수 있는 범위내 정수값이 대입될때도 자동 타입변환이 각각 수행된다. 

반대로 큰 자료형을 작은 자료형에 대입하는 행위를 다운캐스팅이라하고 데이터 손실이 발생할 수 있다. 자동타입변환도 일어나지않음으로 개발자가 명시적으로 타입변환을 수행해야한다. 

public class TypeConversionExample {
    public static void main(String[] args) {

        // =========================
        // 1. 자동 형변환 (작은 → 큰)
        // =========================
        int i = 10;
        double d = i; // int → double (자동)

        // =========================
        // 2. 강제 형변환 (큰 → 작은)
        // =========================
        double d2 = 10.7;
        int i2 = (int) d2; // double → int (소수점 제거)

        // =========================
        // 3. int ↔ String
        // =========================
        int num = 100;
        String s1 = String.valueOf(num); // int → String
        int num2 = Integer.parseInt(s1);  // String → int

        // =========================
        // 4. double ↔ String
        // =========================
        double pi = 3.14;
        String s2 = Double.toString(pi);     // double → String
        double pi2 = Double.parseDouble(s2); // String → double

        // =========================
        // 5. char ↔ int (ASCII)
        // =========================
        char c = 'A';
        int ascii = c;       // char → int (자동)
        char c2 = (char) 66; // int → char

        // =========================
        // 출력 확인
        // =========================
        System.out.println(d);     // 10.0
        System.out.println(i2);    // 10
        System.out.println(num2);  // 100
        System.out.println(pi2);   // 3.14
        System.out.println(ascii); // 65
        System.out.println(c2);    // B
    }
}

https://standout.tistory.com/67

 

묵시적 형변환과 명시적 형변환

결론부터 말하자면 묵시적은 컴퓨터가 알아서 바꿔주는것, 명시적은 개발자가 직접 바꾸는것 묵시적 형변환(Implicit 또는 Promotion)은 연산등의 작업을 수행할 때, 자동으로 형변환이 일어나는 것,

standout.tistory.com

 

 



boolean을 제외한 나머지 기본자료형간에 서로 연산이 가능하다 .

연산자는 영ㄴ산결과특징에 따라 

산술 증감 비트 시프트 연산자

연산결과가 참과 거짓으로 나오는 비교 논리 연산자

값을 반환하는 것이 아닌 값을 대입하는 의미를 가진 대입 연산자.

public class PrimitiveOperationExample {
    public static void main(String[] args) {

        // =========================
        // 1. 정수형 연산 (int)
        // =========================
        int a = 10;
        int b = 3;

        System.out.println(a + b); // 덧셈: 13
        System.out.println(a - b); // 뺄셈: 7
        System.out.println(a * b); // 곱셈: 30
        System.out.println(a / b); // 나눗셈(몫): 3
        System.out.println(a % b); // 나머지: 1

        // =========================
        // 2. 실수형 연산 (double)
        // =========================
        double x = 10.0;
        double y = 3.0;

        System.out.println(x / y); // 3.333...

        // =========================
        // 3. 정수 + 실수 → 실수로 자동 형변환
        // =========================
        int i = 5;
        double d = 2.5;

        System.out.println(i + d); // 7.5 (int → double 자동 변환)

        // =========================
        // 4. char 연산 (ASCII 값으로 계산)
        // =========================
        char c1 = 'A'; // 65
        char c2 = 'B'; // 66

        System.out.println(c1 + c2); // 131 (정수로 변환 후 연산)

        // =========================
        // 5. boolean은 연산 불가
        // =========================
        boolean flag1 = true;
        boolean flag2 = false;

        // System.out.println(flag1 + flag2); // ❌ 컴파일 오류
    }
}

 

 

 


증감연산자는 ++ -- 값을 1씩 증가 감소시킨다 .

public class OperatorExample {
    public static void main(String[] args) {

        // =========================
        // 1. 증감 연산자 (++, --)
        // =========================
        int a = 10;

        System.out.println(a++); // 후위 증가: 10 출력 후 +1
        System.out.println(a);   // 11

        System.out.println(++a); // 전위 증가: 먼저 +1 후 출력 (12)
        System.out.println(a--); // 후위 감소: 12 출력 후 -1
        System.out.println(a);   // 11

        // =========================
        // 2. 비교용 기본 연산
        // =========================
        int x = 5, y = 3;
        System.out.println(x & y); // 비트 AND
        System.out.println(x | y); // 비트 OR
        System.out.println(x ^ y); // 비트 XOR
        System.out.println(~x);    // 비트 NOT

        // =========================
        // 3. 시프트 연산
        // =========================
        int n = 8;

        System.out.println(n << 1); // 왼쪽 shift (×2)
        System.out.println(n >> 1); // 오른쪽 shift (÷2)

        // =========================
        // 4. 비트 연산 설명 (2진수 기준)
        // =========================
        // x = 5  → 0101
        // y = 3  → 0011

        // &  → 둘 다 1이면 1
        // |  → 하나라도 1이면 1
        // ^  → 다르면 1
        // ~  → 0↔1 반전
    }
}

 

 

 


시프트 연산자는 비트 위치를 좌우로이동하는 연산으로 산술시프트 << >> 와 논리 시프트 >>> 가 있다. 

논리 시프트 >>> 는 전체 비트를 오른쪽으로 이동시키는 연산으로 빈칸은 모두 0으로 채운다. 

public class ShiftExample {
    public static void main(String[] args) {

        int a = 8;
        int b = -8;

        // =========================
        // 1. 양수 비교
        // =========================
        System.out.println("a >> 1  = " + (a >> 1));   // 4
        System.out.println("a >>> 1 = " + (a >>> 1));  // 4

        // =========================
        // 2. 음수 비교 (핵심 차이)
        // =========================
        System.out.println("b >> 1  = " + (b >> 1));   // 음수 유지
        System.out.println("b >>> 1 = " + (b >>> 1));  // 큰 양수로 변함

        // =========================
        // 3. 결과 확인용 2진 느낌 설명
        // =========================
        System.out.println("b >> 1  (signed shift)");
        System.out.println("b >>> 1 (unsigned shift)");
    }
}

https://standout.tistory.com/1147

 

자바의 정석 Chapter03: 연산자

들어가기전에, 연산자에 대해 배워갈때 알고있어야하는점은, 연산자의 종류는 기술/코딩의 발전에 따라 그 종류가 방대하기에 한번에 학습하기를 목표로 하기보다는 자주 사용하는 연산자를

standout.tistory.com

https://standout.tistory.com/66

 

혼합연산, 우선순위: 산수 관계 논리

연산 우선순위 산수, 관계, 논리 순으로 우선순위가 정해진다 1+1 || 2+2=true처럼, 1+1과 2+2를 하고 || 논리를 연산하는것이 그 예이다. 같은 연산자종류일 경우, 왼쪽부터 연산하고 대입의 경우 오른

standout.tistory.com

 

 

 

비교연산자 ><<= => == != 

=는 항상 오른쪽에 위치한다. 스택 메모리값을 비교한다. 

https://standout.tistory.com/1147

 

자바의 정석 Chapter03: 연산자

들어가기전에, 연산자에 대해 배워갈때 알고있어야하는점은, 연산자의 종류는 기술/코딩의 발전에 따라 그 종류가 방대하기에 한번에 학습하기를 목표로 하기보다는 자주 사용하는 연산자를

standout.tistory.com

 

 

쇼트서킷 shot circuit

논리연산자로 논리연산을 수행하는 것과 비트 연산자로 논리연산을 수행하는 것과의 차이점

연산을 수행하는 과정에서 결과가 이미 확정되었을때 나머지 연산과정을 생략하는 것을 말한다. 

(5 > 3) || (3 <2) 일때 앞에서 True라면 뒤를 굳이 읽지않는것. 

https://standout.tistory.com/66

 

혼합연산, 우선순위: 산수 관계 논리

연산 우선순위 산수, 관계, 논리 순으로 우선순위가 정해진다 1+1 || 2+2=true처럼, 1+1과 2+2를 하고 || 논리를 연산하는것이 그 예이다. 같은 연산자종류일 경우, 왼쪽부터 연산하고 대입의 경우 오른

standout.tistory.com

 

 

 

대입연산자. 오른쪽 피연산자의 연산결과를 왼쪽 변수에 대입하는 연산자. = 

https://standout.tistory.com/829

 

php .= 복합 대입연산자

.= php복합 대입연산자 변수의 기존값에 새로운 값을 더해서 다시 할당 하는것. $where = "name='John'"; // 초기 값 설정 $where .= " AND age=30"; // 새로운 값을 기존 값에 추가하여 할당 + JavaScript에서는 +=를

standout.tistory.com

 

 

 

삼항연산자

자바연산자중 유일하게 3개의 피연산자가 있는 연산자

(참 또는 거짓 ) ? 참일때 연산결과 : 거짓일떄 연산결과

https://standout.tistory.com/827

 

php 조건삼항연산자, 조건 ? A:B

조건삼항연산자 참일때 앞, 거짓일때 뒷값이 출력된다. 조건 ? 참일 때 값 : 거짓일 때 값 예시코드

standout.tistory.com

 

 

제어문

프로그램의 처리순서를 바꾸는것. 

선택제어문 if ifswitch

반복제어문 for while do-while

제어 키워드 break continue

 

조건문 if단항, if-else문ㅡ if-else if문이 있고

switch 선택 제어문은 변솟값에 따라 특정위치 case로 이동해 구문을 실행하는 선택 제어문이다 .default:는 else와 비슷하며 생략할 수 있다. break가 없으면 끝까지 실행된다. 

switch문과 if문 사이의 성능차이는 거의 없다.

for문은 실행구문을 반복적으로 수행하는 반복제어문으로 for(초기식; 조건식; 증감식)으로 구성된다. 

for(초기식;;증감식) 조건식이 생략되면 컴파일러는 자동으로 true를 입력해 무한루프에 빠진다.

int main() {

    for (;;) {
        printf("무한 반복 중...\n");
    }

    return 0;
}

while은 소괄호안 조건식이 true인 동안 반복 지속된다. 초기식; while(조건식){실행구문; 증감식;} while문 또한 초기식이 while문 실행 이전에 정의되지않으면 무한루프에 빠질 수 있다.

int i = 0;
while (i < 5) {
	int i = 0;
    printf("%d\n", i);
}

do-while은 조건식을 먼저 검사한다.

int main() {

    int i = 0;

    do {
        printf("%d\n", i);
        i++;
    } while (i < 5);

    return 0;
}

제어문과 반복들은 중첩이 가능하다. 

https://standout.tistory.com/1148

 

자바의 정석 Chapter04: 조건문과 반복문

제어문 프로그램의 흐름을 바꾸는 역할을 하는 문장 조건문과 반복문이 있다. https://standout.tistory.com/177 조건문, if와 switch if문과 switch는 비슷하나, 범위는 if문, 값은 switch문이 좋다. if는 그 뜻이

standout.tistory.com

 

 

자바에서 대표적인 참조자료형에 배열, 클래스, 인터페이스 등이 있다 .

배열은 동일한 자료형을 묶어 저장하는 참조자료형으로 생성할때 크기를 지정하고 한번 크기를 지정하면 절대 변경할 수 없다. 

모든 참조 자료형에 실제데이터는 힙 메모리에 생성되며 new 키워드를 사용한다. new 자료형[배열의 길이]

스택 메모리 공간은 값을 초기화하지않으면 빈공간으로 존재하며 기본자료형일때 숫자는 모두 0, 불리언은 false로 초기화된다. 

외의 모든 자료형은 null

참고자료형은 실제 데이터값이 아닌 힙 메모리에 저장된 객체의 위치를 저장한다. 위칫값. 배열의 길이는 a.length로 읽는다. a[0] index값으로 값을 출력할 수 있다. 

https://standout.tistory.com/1149

 

자바의 정석 Chapter05: 배열

배열 같은 타입의 여러변수를 하나의 묶음을 다루는것, 배열 + 배열등의 2차원 배열 조합도 가능하다. https://standout.tistory.com/143 선형자료구조, 배열 선형자료구조, 배열 메모리, 데이터를 관리하

standout.tistory.com

 

 

우리가 무심코 지나쳤던 main() 코드를 다시 봐보자. main() 입력매개변수를 살펴보면 public static void main(String[] ar){}이 있다. 

자바코드를 실행하면 자바가상머신은 main()을 실행하는데 이때 개발자는 실행하는데 필요한 자료를 배열타입으로 넘겨줄 수 있다. run - run configurations 메뉴에서 java application - arguments - 변수값을 입력 - run하면 세팅한 값이 넘어가 main()에서 수행된다. 

 

 

 

String 클래스

한번 정의된 문자열은 변경할 수 없고 내용을 변경하면 자바 가상 머신은 기존 문자열을 수정하는 것이 아니라 새로운 문자열을 포함하고 있는 객체를 생성해 사용하고 기존 객체는 버린다. 리터럴은 바로 입력한 데이터가 문자열이 같을때 하나의 객체를 공유한다 .string 객체의 + 연산은 더하기의 의미가 아닌 연결하기의 의미이다. 

public class Main {
    public static void main(String[] args) {

        String str1 = "Hello";
        String str2 = "Hello";

        System.out.println(str1 == str2);
        System.out.println(str1.equals(str2));
    }
}



true
true

https://standout.tistory.com/1196

 

java.lang패키지 : String 클래스

타 언어에서 문자열을 char형의 배열로 다루나 자바에서는 문자열을 위한 클래스를 제공한다. 문자열 관련 메서드는 방대하며 아래는 자주 사용될것들으로 이해한다. 물론 이도 양이 상당하다. S

standout.tistory.com

 

 

length()는 문자열의 길이, charAt()는 문자열에서 특정 인덱스에 위치해 있는 문자를 알아내고 indexOf() 문자열에서 특정 문자나 문자열을 앞에서부터 찾아 위칫값을 알아낸다. lastIndexOf() 문자열에서 특정 문자나 특성문자열을 뒤에서부터 찾아 위칫값을 알아낸다. string.valueif() 기본 자료형을 문자열로 바꾸는 정적메서드, concat() 2개의 문자열을 연결하는 + 와 동일한 기능, getbytes() 문자열을 byte배열로 변환, tochararray() 문자열을 char 배열로 변환할수있으며 이는 자바 입출력과정에서 주로 사용한다. 

tolowercase() 모두 소문자로, touppercase() 모두 대문자로, replace 일부문자열을 다른 문자열로 대체한다. substring() 문자열의 일부만을 포함하는 새로운 문자열 객체를 생성한다. split() 특정 기호를 기준으로 문자열을 분리한다, trim() 문자열의 좌우 공백을 제거한다. equials() 두 문자열의 실제 데이터값을 비교한다. 대소문자를 구분한다. equalsIgnorecase() 실제 데이터값을 비교한다. 대소문자를 구분하지않는다.

public class Main {
    public static void main(String[] args) {

        String str = "Java,Python,C++";

        // replace
        str = str.replace("C++", "JavaScript");
        System.out.println(str);

        // substring
        System.out.println(str.substring(0, 4));

        // split
        String[] arr = str.split(",");

        for(String s : arr) {
            System.out.println(s);
        }
    }
}

 

 

클래스 

객체는 사용할 수 있는 실체, 클래스는 객체를 만들기 위한 설계도와같다. 

객체지향 전에는 대부분이 절차지향형으로 구현했다. 순서에 맞춰 단계적으로 실행하도록 명령어를 나열하는 것을 의미한다. 

자바에서 제공하는 객체지향 문법요소로는 클래스와 인터페이스가 있고 클래스는 다시 일반클래스, 추상 클래스로 나뉜다. 

클래스 외부에는 패키지, import, 외부클래스만 올 수 있다. 

클래스 내부에는 필드, 메서드, 생성자, 이너 클래스가 포함 될 수 있다. 

https://standout.tistory.com/100

 

클래스와 인터페이스의 구성

앞서 클래스와 인터페이스의 차이를 간단히 확인해봤다. 이제 클래스와 인터페이스의 구성하는 각각의 요소를 확인해보자. https://standout.tistory.com/85 JAVA Interface, 인터페이스 Class와의 차이 인터

standout.tistory.com

https://standout.tistory.com/14

 

객체와 객체지향프로그래밍 OOP

객체 Object 객체는 깔끔하게 정의내리기 어렵다. 이해가 힘들다면 '나를 제외한 모든 것'이라고 이해하고 넘어가보자. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로, 정의

standout.tistory.com

 

 

 

클래스에서 객체를 만드는 과정은 생성자가 수행하며 클래스의 생성자로 객체를 만드는 과정을 인스턴스화, 인스턴스화로 만들어진 객체를 인스턴스라고 한다. 

객체는 new 키워드로 생성할 수 있다. 

포인트 연산자 . 로 해당 위치에 있는 객체 안을 볼 수 있다. 

https://standout.tistory.com/1155

 

객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다. Memer class에서 만들어진 'sanghee'라는 사람객체는 Member의

standout.tistory.com

 

 

필드는 클래스에 포함된 변수다. 필드는 지역변수와 구분해야한다. 지역변수는 메서드에 포함된 변수를 말한다. 

필드와 지역변수의 가장 큰 차이점은 생성되는 메모리의 위치로 필드는 힙 메모리의 객체 내부, 지역변수는 스택메모리에 생성되  자바가상머신이 자동으로 삭제하지만 힙 메모리 객체 안의 필드는 객체가 사라지지않는 한 삭제되지않는다. 

https://standout.tistory.com/653

 

필드리서치란?

필드리서치 과제, 장소(맥락), 라이프스타일 중심의 3가지 형태로 구분된다. 사용자에 대한 깊은 이해를 가능하게하나 상대적으로 오랜시간을 투여해야 한다는 제약이 있다. 과제 중심 필드리서

standout.tistory.com

 

 

메서드

클래스의 기능에 해당하는 요소. 

사람이 클래스라면 먹기, 잠자기, 공부하기 등이 메서드로 구성될 것이다. 

리턴타입이 void이면 반환값이 없다는 것을 의미하고 return 문이 들어가 있지않는다 .

클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야한다. 

클래스 내부에서 메서드는 객체를 생성하지않고 서로를 호출 할 수 있다. 

public class Main {

    public static void hello() {
        System.out.println("안녕하세요");
    }

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

 

 

 

입력매개변수가 배열일때 값을 명시한다면 바로 실행되고, 외 객체로 넘기지않으면 에러가 난다.

public class Main {

    public static void printNumbers(int[] arr) {

        for(int num : arr) {
            System.out.println(num);
        }
    }

    public static void main(String[] args) {

        printNumbers(new int[]{10, 20, 30});
    }
}
public class Main {

    public static void printNumbers(int[] arr) {

        for(int num : arr) {
            System.out.println(num);
        }
    }

    public static void main(String[] args) {

        int[] numbers = {10, 20, 30};

        printNumbers(numbers);
    }
}
public class Main {

    public static void printNumbers(int[] arr) {

    }

    public static void main(String[] args) {

        printNumbers(10, 20, 30);
    }
}


The method printNumbers(int[]) is not applicable
for the arguments (int, int, int)

 

 

 

메서드 오버로딩을 이해하기 위해서는 메서드 시그니처의 의미를 알아야한다.

메서드 시그니처는 메서드명과 입력매개변수의 자료형을 말한다. 

자바 가상머신은 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식한다. 메서드 오버로딩은 이러한 특징을 이용해 입력 매개변수의 개수나 자료형이 다른 여러개의 동일한 이름을 지닌 메서드를 같은 공간에 정의하는 것을 말한다. 

 mothod(int... values) 는 갯수와 상관없이 정수를 입력으로 받을 수 있다. 오버로딩만 사용했다면 3개의 메서드를 오버로딩해야하지만 가변 길이 배열 입력매개변수를 사용하면 단 1개의 메서드만 정의해 위의 모든 메서드 호출에 대응할 수 있게 된다. 

 

생성자

객체를 생성하는 역할을 지닌 클래스의 내부구성요소

생성자가 없는 클래스는 붕어빵을 찍을 수 없는 붕어빵 기계를 만든 셈으로 존재이유가 없다. 

컴파일러는 생성자가 없는 클래스를 만들면 적어도 1개의 생성자가 필요해 입력 매개변수가 없는 기본 생성자를 추가해준다. 

 

 

내부객체 참조 변수명 this 키워드

모든 메서드에는 자신이 포함된 클래스 객체를 가리키는 this라는 참조변수가 있다.  모든 멤버는 객체 속에 존재함으로 int m = 3이라는 필드를 클래스 내부에서 출력하려면 system.out.println(this.m)와 같이 작성해야하나 this.를 생략하면 컴파일러가 자동으로 this를 추가한다 .지역변수는 멤버가 아님으로 this가 붙지않는다. 

 

this()

this키워드와 매우 비슷하게 생겼지만 this()는 자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령이다. 만일 클래스명이 A라면 this는 A()생성자를 호출하는것이고 this(3)이라면 A(3), 데이터를 하나 입력받는 생성자를 호출하라느 ㄴ말이 된다. 

이는 생성자의 내부에서만 사용할 수 있고 생성자의 첫줄에 위치해야한다. 

 

패키지 

비슷한 목적으로 생성된 클래스파일을 한곳에 모아놓은 폴더

클래스 풀네임을 사용하거나  다른 패키지 내의 클래스를 사용하기 위한 문법 요소 import와 함꼐 쓴다. 

 

외부클래스는 클래스 외부에 추가로 정의한 클래스를 말한다. 

1개의 자바 소스파일에는 최대 1개의 public 클래스만 존재할 수 있고 그 클래스명은 파일명과 일치해야한다. 

 

멤버 및 생성자에는 public protected, default, package, private등의 접근 지정자를 사용할 수 있다. 만약 아무것도 작성하지않으면 default 접근 제어자가 자동으로 설정된다. 

접근범위는 public>protected>default(package)>private 순이다. private는 자신의 클래스 내부에서만 사용할 수 있고 외부 클래스에서는 전혀 사용할 수 없다. defatult는 같은 패키지안의 모든 클래스에서 사용할 수 있다. proteced는 일단 같은 패키지의 모든 클래스와 다른 패키지의 자식 클래스안에서 사용할 수 있다. public은 동일 패키지, 모든 클래스 다른패키지 모든 클래스에 접근 할 수 있다는 것을 의미한다 .

default로 접근지정자를 지정하면 다른 패키지에서 임포트가 불가능해 사용할 수 없다 .

 

static 제어자, 객체 안에 있을때 사용할수 있는 상태가 되는 멤버를 인스턴스 멤버라고 말하고 이는 멤버 앞에 static이 붙어있지 않은 것을 말한다.  static이 부터있는 멤버를 정적멤버라고 한다. 

정적필드는 클래스 내 부에 저장공간을 지니고 있어 객체 생성없이 바로 사용할 수 있다. 정적 필드는 객체 간 공유 변수의 성질이 있다. 

. 정적 메서드 내부에서는 정적 멤버만 사용할 수 있다.  static{}은 정적 초기화 블록으로 객체가 만들어지는 시점에서 이뤄진다.  적적필드는 객체 생성 이전에도 사용할 수 있어야함으로 생성자가 호출되지않은 상태에서도 초기화할 수 있어야하고 즉 생성자에서는 정적 필드를 초기화할 수 없다. 이 문법.정적 포기화 블록. 클래스가 메모리에 로딩될때 가장 먼저 실행된다. 

 

클래스 상속은 부모 클래스 멤버를 내려받아 자식 클래스 내부에포함시키는 자바 문법 요소다. 상속의 경우 코드의 중복성이 제거되고 다형적 표현이 가능하다. 이렇게 1개의 객체를 여러가지 모양으로 표현할 수있는 특성을 다형성이라고 한다 .클래스를 상속할때는 extends 키워드를 사용한다. 클래스는 다중 상속이 불가능하다. 모호성을 허용하지 않기 때문이다. 자바가상머신은 자식클래스의 객체를 생성할때 가장 먼저 부모클래스의 객체를 생성한다. 생성자는 자식 클래스로 상속되지않는다. 

 

업캐스팅 다운스캐팅

업캐스팅은 기본자료형에서 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅하는 것을 말하고 다운캐스팅은 그 반대였다. 

객체는 자식클래스에서 부모클래스 쪽으로 변환되는 것을 업캐스팅, 그 반대가 다운캐스팅이다.  객체는 항상 업캐스팅할 수 있어 명시적으로 넣어주지않아도 컴파일러가 넣어주나 다운캐스팅은 개발자가 명시적으로 넣어주어야한다. 캐스팅의 가능 여부는 무슨 타입으로 선언되어있는지는 중요하지않고 어떤 생성자로 생성되었는지가 중요하다. C타입으로 캐스팅시 힙 메모리에 C타입 객체가 만들어진적이 없다면 다운캐스팅 할 수없다. 이와같은 이유로 캐스팅의 가능 여부를 확인하기 위해 실제 어떤 생성자로 만드는 지가 중요했던 것.  이 캐스팅 가능여부를 확인하기위해 instanceof() 키워드를 사용하면 상속관계나 객체를 만든 생성자를 직접 확인하지않아도 캐스팅 가능 여부를 확인 할 수 있다. 

 

메서드 오버라이딩

메서드 오버라이딩은 부모 클래스에게 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것이다. 부모 클래스 객체가 힙 메모리에 먼저 생성되고 b가 오버라이딩할경우 메서드가 덮어쓰기가 되어 b 클래스가 출력된다.메서드 오버로딩은 이름이 동일하지만 시그니처가 다른 여러개의 메서드를 같은 공간에 정의하는 것을 말한다. 복사할때.  자식 클래스가 부모 메서드를 오버라이딩 할때는 상속받은 메서드의 접근 지정자와 범위가 같거나 넓은 접근 지정자를 사용해야한다. 즉 접근 지정자의 범위를 좁힐 수 없다. 

 

super와 super() 

this키워드와 this() 메서드는 클래스 자신의 내부 구성요소를 호출하는 문법요소로 this는 자기 객체를, this()는 자신의 또다른 생성자를 호출하는 것이라고 했다. super는 부모의 객체, super()는 부모 생성자를 의미한다. 

 

최상위 클래스 object

자바의 모든 클래스는 object 클래스를 상속받는다. 실제로 컴파일러는 아무런 클래스로 상속하지 않으면 자동으로 extends object를 삽입해 object클래스를 상속한다. system.out.ptintln() 와 같은 다양한 타입을 출력하기 위해 여러갱의 입력매개변수타입으로 오버로딩 되어있는데 object x가 바로 그 해답이다. object 입력매개변수로 하는 메서드는 어떤 클래스 타입의객체를 생성하더라도 다형성에 따라 모든 타입의 객체를 받아들일 수 있다. 최상위 부모 크래스.  object 클래스의 대표적인 매서드에는 toString(), 스택 메모리 값을 비교하는 equals() 객체의 위치와 연관된 값 hasCode()가있다.. 

 

final

final은 필드, 지역변수, 메서드, 클래스 앞에 위치할 수 있다. 한번 대입된 값이 최종 값이 되는 것으로 값을 수정할 수 없다. 상수 메서드를 final로 정의하면 자식 클래스에서 해당 메서드를 오버라이딩 할 수 없다. 

final 클래스는 상속 자체가 아예 불가능하다. 

 

abstract 

추상적인. 추상메서드. 구체적이지 않다는 의미다. 미완성 메서드. 아직 무슨 기능을 정의할지 정해지지않았다는 의미이다. 중괄호 안을 비워 에러가 아지않도록 미완성 메서드 추상메서드로 정의하는것이 효율적이다. 추상 클래스도 당연히 상속할 수 있다 추상 메서드를 1개이상 보유하고있는 클래스는 반드시 추상 클래스로 정의해야한다. 추상클래스는 객체를 직접 생성할 수 없다. 추상클래스는 객체를 직접 생성할 수 없지만 추상 클래스를 상속한 자식클래스를 생성하면 그 자식 클래스로는 객체를 생성 할 수 있다. 추상클래스를 상속하는 자식 클래스는 미완성 메서드를 반드시 오버라이딩해 완성시켜야한다. 클래스 animal이 동물마다 우는 소리가 다르자면 자식클래스에서 반드시 구현하도록 강제해야할것이다. 이러한 규칙을 만들거나 다양한 결제 방식들을 모두 pay()를 가져야한다면 부모클래스가 공통규칙을 정의해 구현은 자식에게 맡기되 기능규칙을 정의 할 수 있는 것이다. 

 

인터페이스

인터페이스는 내부의 모든 필드가 public static final 로 정의되고 static과 default메서드 이외의 모든 메서드는 public abstract 로 정의된 객체 지향 프로그래밍 요소다 .class키워드 대신 interface키워드를 사용해 선언한다. 클래스가 클래스를 상속할때 extends키워드를 사용한 반면 인터페이스는 implements키워드를 사용하고 쉼표로 구분해 나열해 다중 상속이 가능하다. 인터페이스도 추상메서드를 포함하고있어 객체를 직접 생성 할 수 없다. 마찬가지로 자식 클래스를 정의하고 자식 클래스의 생성자로 객체를 생성하는 방법과 이너 클래스를 이용해 바로 객체를 생성하는 방법을 사용할 수 있다. 인터페이스는 입출력의 호환성을 의미하고 냉장고든 선풍기든 플러그가 있는 가전제품이라면 정상적으로 연결할 수 있듯 인터페이스를 활용해 프로그램을 작성하고 각 회사들이 인터페이스를 구현한 클래스를 생성한다면 메서드 내부 구현은 다르지만 드라이버등의 애플리케이션은 수정할 필요가없는것. 하드웨어를 바꿀때마다 애플리케이션을 수정해하는 상황은 인터페이스가 있는 한 없다. 인터페이스 안에는 public default 메서드가 있다. 디폴트 메서드 또한 비록 완성된 형태이나 인터페이스 자체가 여전히 객체를 만들 수 없음으로 상속시켜야 가능하다. 인터페이스는 또한 static 메서드를 포함 할 수 있는데 클래스 내부 정적 메서드와 동일한 기능으로 객체를 생성하지않고 인터페이스명.정적메서드명 방식으로 호출 할 수 있다. 

 

inner class

클래스 내부에 포함되는 이너클래스는 인스턴스 멤버 이너클래스, 정적멤버 이너 클래스, 지역 이너 클래스로 나뉜다. 

인스턴스 멤버 이너 클래스는 객체 내부에 멤버 형태로 존재하며 아우터 클래스의 접근 지정자 멤버에 접근 할 수 있다. class{ class{}} B가 아우터 클래스 필드를 참조하려면 A.this.a와 같이 사용해야한다. 

정적 멤버 이너클래스는 클래스 앞에 static키워드가 포함된 이너클래스로 아우터 클래스 객체를 생성하지않아도 바로 사용할 수 있다. class a{static class b{}} 

지역이너클래스는 멤버가 아닌 메서드 내에서 정의되는 클래스로. 지역변수처럼 정의된 메서드 내부에서만 사용할 수 있어 일반적으로 선언이후 바로 객체를 생성해 사용한다. 지역변수를 사용할때는 반드시 해당 변수가 final로 선언되어야한다.  final로 선언되지않았다면 컴파일러가 강제로 추가한다. 

 

익명 이너 클래스

이름을 알 수 없는 이너 클래스, 이너 클래스를 사용하면 직접 클래스를 추가로 정의해야하는 수고로움을 덜 수도 있다. 다만 여러개의 객체를 생성하고자 할때는 추상 메서드를 객체를 생성할때마다 구현해야함으로 익명 이너 클래스보다 직접 클래스를 추가로 작성하는 것이 좋다. 

 

이너 인터페이스

이너 클래스와 마찬가지로 인터페이스를 클래스 내부에 정의하는것은 해당 클래스에 의존적인 기능을 수행할때이며 보통은 버튼 클래스 내부에 버튼 클릭을 감지하는 인터페이스처럼 사용자 인터페이스의 이벤트 처리에 가장 많이 사용된다. 

음악을 재생하는 버튼과 네이버를 접속하는 버튼을 따로 만들어 제공하는것이 아니라 버튼의 기능을 정의할 수 있는 인터페이스를 클래스 내부에 정의해 제공하면 1개의 버튼 클래스로 수천개의 기능을 수행하는 버튼을 만들 수 있다. 

 

예외

다양하게 발생하는 오류 중 개발자가 해결할 수 있는 오류를 예외, 예외가 발생했을때 처리하는 것을 예외처리라고 한다. 에러처리란 오류가 발생했을때 차선책을 선택하는 것을 말한다. 

예외의 최상위클래스는 Exception, 에러의 최상위 클래스는 Error 클래스다. 모두 Throwable을 상속해 기능을 포함한다. 

RuntimeException 실행예외는 컴파일전이 아니라 실행할때 발생함. 

interruptedException 일정시간동안 일시정지중... Thread.sleep()등에서 실행 중 예외발생할 수 있다. 

ClassNotFoundException 클래스 못찾을때

IOException 데이터를 w, r할때 발생한다. 

FileNotFoundException 파일 못찾을때

CloneNotSuportedException clone()은 자신의 객체를 복사한 클론객체를 리턴하는 매서드이고 Cloneable 인터페이스를 상속하지않은 클래스의 객체를 clone()시 발생한다. 

ArtithmeticException 연산오류

ClassCastException 불가능한 상황에서 다운캐스팅을 시도할때

ArrayIndexOutOfBoundsException 배열의 인덱스의 범위를 벗어날때

NUmberFormatException 숫자가 아닌것을 숫자로 바꿀 때.

NullPointerException 객체가 없을떄

 

예외처리는 try, catch, finally로 구성된다. 

catch가 여러개로 다중 예외처리가 가능하다. 

finally는 항상 실행해야하는 기능으로 대표적으로 리소스를 해제하는 기능으로 사용한다. 자원반납용.

예외 처리는 쉼표로 구분해 나열하며 여러개의 예외를 한번에 전가할 수 있다 .

사용자가 예외클래스를 정의해서 사용할 수도 있다. 

thorw로 예외를 오히려 던질 수도 있다. 

getmessage() 메서드로 메세지를 문자열 형태로 리턴한다.