자바 문법뽀개기

\n 코드를 통해 줄바꿈이 가능하다

String : 문자열

int : 정수

double : 실수

실수형

float(4바이트) 실수뒤에 F를 붙여줘야함 ex) float a = 2.2F;

double(8바이트) : float보다 더많은 범위 표현가능 float를 써야할 이유가 분명하지 않으면 왠만하면 double을 쓰자 !

데이터의 크기

8bit : 1바이트

1024 바이트 : 1킬로바이트

1024 킬로바이트 : 1메가바이트

1024 메가바이트 : 1기가바이트

1024 기가바이트 : 1테라바이트

1024 테라바이트 : 1페타바이트

1024 페타바이트 : 1엑사바이트

1024 엑사바이트 : 1제타바이트

데이터타입 비교

문자 (글자하나를 의미)

char (2바이트) :모든 유니코드 문자

상수형 데이터 타입

변수는 변하는값 , 상수는 변하지 않는 값

int a(변수) = 1(상수);

long데이터 타입은 정수뒤에 L을 붙여줘야함 EX) long a =22222222222222L;

형변환

int b = (int)100.0F; // 100 (float값을 정수로 형변환)
float a = (float)100.0; // 100.0 

switch 문

public class Main {
    public static void main(String[] args) {
        switch (2) {
            case 1:
                System.out.println(1);
            case 2:
                System.out.println(2);
            case 3:
                System.out.println(3);
                break;
            case 4:
                System.out.println(4);
            default:
                System.out.println("default");
//       2 와 3을 출력하고 4로 가기전에 브레이크로 이구문을 탈출
    //   나와있는 범위를 초과시 디폴트에 있는값을 출력한다
       }
    }
}

반복문 1 (while)

public class Main {
    public static void main(String[] args) {
        int i = 0;
        while (i < 10) {
            System.out.println("coding" + i);
            i++;
//       coding0 ~ coding9 까지 출력
        }
    }
}

반복문의 중첩

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            for (int j =0; j<10; j ++) {
                System.out.println(i + "" +j);
            // 00 ~ 99 출력
            }
        }
    }
}

반복문과 배열의 조화

public class Main {
    public static void main(String[] args) {
        String[] members = {"a" ,"b" , "c"};
        for (int i =0; i < members.length; i++) {
            String member = members[i];
            System.out.println(member + "이 상담을 받았습니다.");
// a이 상담을 받았습니다. / b이 상담을 받았습니다. / c이 상담을 받았습니다.
        }
    }
}

for - each문 (위 반복문 배열 보다 간결히 사용가능)

public class Main {
    public static void main(String[] args) {
        String[] members = {"a" ,"b" , "c"};
        for (String e : members) {
            System.out.println(e + "이 상담을 받았습니다.");
// a이 상담을 받았습니다. / b이 상담을 받았습니다. / c이 상담을 받았습니다.
        }
    }
}

메소드(입력값)

public class Main {
    public static void numbering(int limit) {
        int i = 0;
        while (i < limit) {
            System.out.println(i);
            i++;
        }
    }
    public static void main(String[] args) {
        numbering(5);
        //      4까지 출력
    }
}

public class Main {
    public static void numbering(int init,int limit ) {
        int i = init;
        while (i < limit) {
            System.out.println(i);
            i++;
        }
    public static void main(String[] args) {
        numbering(11,15);
            // 11 ~ 14 까지  출력
    }
}

출력값

public class Main {
    public static String numbering(int init, int limit ) {
        int i = init;
        String output = "";
//      만들어지는 숫자들은 아웃풋이라는 변수에 담기 위해서 변수에 빈 값을 주었다.
        while (i < limit) {
//      숫자를 화면에 출력하는 대신 변수 아웃풋에 담았다.
            output += i;
            i++;
        }
        return output;
//      중요 !! 아웃풋에 담겨있는 문자열을 메소드 외부로 반환하려면 아래와같이 리턴
//      배치하면된다
    }
    public static void main(String[] args) {
        String result = numbering(1,5); 
//      메소드 넘버링이 리턴한 값이 변수 리절트에 담긴다.
        System.out.println(result);
//      변수 리절트의 값을 화면에 출력한다.
    }
}

객체지향

Static을 포함하면 클래스 메소드
포함하지않으면 인스턴스 메소드
인스턴스 메소드는 클래스 맴버에 접근 할수 있다.
클래스 메소드는 인스턴스 맴버에 접근 할수 없다.
인스턴스 변수 - Non-Static Field
클래스 변수 - Static Field

생성자

class Calculator {
    int left, right;
    public Calculator(int left, int right) {
//  클래스와 똑같은 메소드명(생성자)이 중요 포인트 !
// 클래스가 생성될떄 자동으로 클래스와 똑같은 이름을 가지고있는 생성자가 실행되도록 약속되어있음 어떤 메소드보다 먼저 실행되도록 약속되어있음
// 클래스와 같은이름가지고있는 어떤 메소드를 정의해서 그 메소드의 내용을 채워넣게 되면 그 내용(로직)은 어떠한 메소드보다 먼저 실행이 되서 해당 객체가 가장먼저 해야할일(초기화작업)을 하게함 
        this.left = left;
        this.right = right;
    }
    public void sum() {
        System.out.println(this.left + this.right);
    }
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
public class Main {
    public static void main(String[] args) {
        Calculator c1 = new Calculator(10, 20);
        c1.sum();
        c1.avg();
    }
}

상속


  • 오버라이딩 : 부모 클래스에서 받은 메소드를 필요애따라 변경 하는것 (부모클래스와 자식클래스의 시그니처가 서로 같아야함) Super키워드를 사용해야함

class Calculator {
    int left, right;
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
    public void sum() {
        System.out.println(this.left + this.right);
    }
    public int avg() {
        return ((this.left + this.right) / 2);
    }
}
class SubstractionableCalculator extends Calculator {
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
    public int avg() {
        return super.avg();
    }
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
public class Main {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        System.out.println("실행 결과는" + c1.avg());
        c1.substract();
    }
}

  • 오버로딩 : 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다.

    (기존에 없던 새로운 메서드를 정의하는 것)
class Calculator{
    int left, right;
    int third = 0;
    public void setOprands(int left, int right){
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }
    public void setOprands(int left, int right, int third){
        this.setOprands(left , right);
        System.out.println("setOprands(int left, int right, int third)");
        this.third = third;
    }
    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }
    public void avg(){
     System.out.println((this.left+this.right+this.third)/3);
    }
}
public class Main {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.setOprands(10, 20, 30);
        c1.sum();
        c1.avg();
    }
}

접근제어자


- 문법

1 . (public은 어디에서든지 접근할수있다 , private은 같은 클래스내에서만 접근할수있다.)

2 . protected는 같은 패키지(같은소속)에서만 접근가능 단,상속 관계시 받은파일(다른소속)에서는 가능

3 . default는 다른 패키지일 경우 상속관계일지라도 접근불가능

4 . private

class A {
    public String y(){
        return "public void y()";
/  외부적으로 사용이가능
    }
    private String z(){
        return "public void z()";
/ (private) 클래스 내부적으로는 사용할수있지만 외북적으로 사용이불가능
    }
    public String x(){
        return z();
    }
}
public class Main {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.y());
        // 아래 코드는 오류가 발생한다.
        //System.out.println(a.z());
        System.out.println(a.x());
    }
}

클래스 접근 제어자


클래스를 public으로 지정을한다면 그 클래스의 소크코드파일은 클래스와 같은 이름으로 해줘야한다.

(퍼블릭으로 지정되있는 클래스와 소스코드의 파일이 다르면 컴파일 에러가난다.)

abstract(추상)

final


추상이 상속을 강제하는 것이라면 final은 상속/변경을 금지하는 규제다. 이 정도로 final의 용도를 기억해두고 코드를 보자.

/ final 메소드
package org.opentutorials.javatutorials.finals;
class A{
    final void b(){}
}
class B extends A{
    void b(){}
}
/ final 메소드는 final 변수 만큼 사용 빈도가 높지는 않다. 위 코드는 final 메소드 b를 상속하려하기 때문에 오류가 발생한다.

/ final 클래스
package org.opentutorials.javatutorials.finals;
final class C{
    final void b(){}
}
class D extends C{}
/ final 클래스를 상속하려하고 있다. 따라서 오류가 발생한다.

인터페이스


단순한 예제)

interface I{
    public void z();
}
class A implements I{
    public void z(){}
}
/ 클래스 A 뒤의 implements I는 이 클래스가 인터페이스 I를 구현하고 있다는 의미다. 그것은 3행의 interface I의 맴버인 public void z() 메소드를 클래스 A가 반드시 포함하고 있어야 한다는 뜻이다. 
따라서 위의 코드는 문제가 없다. 인터페이스의 의미를 좀 더 분명하게 하기 위해서 8행의 public void z(){}를 삭제하자. 컴파일 에러가 발생할 것이다. 

인터페이스 규칙들


1 . 인터페이스를 선언할때 정의되는 멤버들의 접근제어자들은 public으로 와야한다.(멤버는 반드시 퍼블릭이다.)

2 . 인터페이스는 본체가없는 메소드들을 가지고 있어야한다.

메소드와 다형성 :

다형성 : 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.


인터페이스

예외

  • 변수 :

어떠한 데이터를 저장하기 위한 메모리 공간의 이름입니다. 지속적으로 변수의 값을 변경할 수 있다. (첫글자는 숫자,특수문자가 오지못함)

  • 상수 :

중간에 값이 변할 수 없으며 초기값을 끝까지 사용해야 한다.

  • 앞에 final 키워드를 붙여 생성을한다

  • ex) final int finalNumber =1;

자바의 네이밍 규칙(캐멀케이스규칙) : ex)finalNumber

첫글자는 소문자로 오고 그다음 구분되는 단어첫글자는 대문자로 구분한다

자료형 : 숫자 , 문자 , 논리 , 바이트


  • 숫자 :

숫자 관련한 값을 변수로 선언할 수 있습니다.


  • 문자 :

문자 관련한 값을 변수로 선언할 수 있습니다.


  • 논리 : 참 거짓의 값을 변수로 선언할 수 있습니다


  • 바이트 : 바이트를 변수로 선언할 수 있습니다. 컴퓨터에서 표현되는 모든 데이터는 사실상 바이트의 연속입니다. 바이트를 직접 쓰실일은 별로 없겠지만, 바이트로 표현할 수 있다는 것만 알아두세요.

  • 자료형 - 참조 자료형

Array 는 출력값에 알트+엔터 +엔터 눌러주기

  • 자료형 퀴즈 :

퀴즈 1: 문자 변수 'S' , 정수형 변수 10 를 선언 및 출력해보세요.


  • 방법 1


  • 방법 2

c가 아스키코드의 십진법으로 계산되어 출력

해결하기위한방법은 방법3이미지 참고


  • 방법 3

쌍따움표 (" ")를 붙여서 c10으로 출력되는모습


  • 방법 4

백슬래쉬n (\n)을 붙이면 붙여서 출력하는게 아님 다음줄로 행이동을해서 하나씩 출력함


연산자

대입연산자



관계연산자


논리 연산자


조건문


SWITCH문

break : 조건이 맞다면 밑에는 실행시키지않고, switch문 밖으로 나가게 해주는 역할을 함


삼항연산자

? : true or false 일때 메서지 출력

조건문 퀴즈 1:

입력받은 점수가 무슨 등급인지 출력하기

(100~91점 : A등급 , 90점~81점 : B등급 , 80점~71점 : C등급 , 그 외의 점수 : F등급)

(참고로, 입력을 받는 코드는 아래와 같습니다.)


public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int score = sc.nextInt();
}

처음 스캐너가 빨간줄로 표시될떄 알트 +엔터키 해줘서 필요한 라이브러리 임포트 해주기

(System.in);

시스템 인풋을 받을꺼라는 의미

.nextInt();

다음에 들어오는 숫자를 받을꺼라는 의미

결과값 :

nextInt 형식은 터미널창에 값을 입력해주고 엔터 !!

반복문

  • for문


for(초기값 ; 조건식 ; 증감식){
    실행 코드 블럭
}


  • for - each문


  • While 문

while(조건식){
    실행 코드 블럭
}

break :

  • break는 반복문을 더 이상 실행하지 않고 끝내는 역할을 함

continue :

  • 반복문을 진행하다가 continue가 있을 경우, 다시 반복문 코드 블럭의 처음 부분으로 돌아가서 진행함(스킵)

do-while문 :

- do-while문과 while문의 차이가 나타납니다. while문은 조건식에 부합할 경우 코드 블럭을 실행하지만, do-while문은 일단 코드 블럭을 무조건 한번 실행한 후, while문의 조건을 비교합니다.

- 즉, while문의 조건을 확인하기 이전에 do 내부의 코드블럭을 한 번 시행한 후, 그 이후에는 while문의 조건에 일치하지 않으므로 더이상의 실행은 하지않고 출력을 하게 되는 것입니다.

좋은 웹페이지 즐겨찾기