자바 기초문법 정리 (1)

한경훈·2023년 12월 11일

PLAYDATA

목록 보기
2/2
post-thumbnail

변수

프로그램에서 데이터를 저장하기 위해 사용하는 메모리 공간이다.
변수를 사용하면 데이터를 일관되게 관리하고, 코드를 보다 간결하고 읽기 쉽게 만들 수 있다. 자바에서 변수는 자료형과 변수명으로 구성된다.

  • 변수 선언

    int number; // 정수형 변수
     String name; // 문자열 변수
     double pi; // 실수형 변수
     boolean isAdult; // 불리언형 변수
  • 변수 저장

     number = 10;
      name = "홍길동";
      pi = 3.14;
      isAdult = true;
  • 변수 선언 및 저장

    int number = 10; // 정수형 변수 number를 10으로 초기화
     String name = "홍길동"; // 문자열 변수 name을 "홍길동"으로 초기화
     double pi = 3.14; // 실수형 변수 pi를 3.14로 초기화
     boolean isAdult = true; // 불리언형 변수 isAdult를 true로 초기화

클래스

표현하고자 하는 대상의 공통 속성을 한 군데에 정의해 놓은 것
즉, 객체의 속성을 정의한 것이다.
객체의 속성에는 필드, 메소드, 생성자 등이 있다.
필드는 클래스 내부 전역에서 사용 가능한 전역 변수를 지칭한다.
필드(전역변수)는 멤버 변수라고도 한다.
반면 메소드와 생성자에서 정의된 변수는 지역변수라고 한다.

  • 클래스 선언
    // 클래스 이름
     class 클래스이름 {
     class Person {
  • 클래스를 사용하여 객체를 생성
    // 클래스 이름 변수명 = new 클래스이름();
    Person person = new Person("홍길동", 30);

객체

어떠한 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
아래의 코드에서 Phone은 클래스이고, 메인 함수의 galaxy와 iphone은 객체들이다.

class Phone {
    String model;
    String color;
    int price;
}
public class Main {
    public static void main(String[] args) {
        Phone galaxy = new Phone(); 
        galaxy.model = "Galaxy10";
        galaxy.color = "Black";
        galaxy.price = 100;
        
        Phone iphone =new Phone();
        iphone.model = "iPhoneX";
        iphone.color = "Black";
        iphone.price = 200;      

        System.out.println("철수는 이번에 " + galaxy.model + galaxy.color + " + 색상을 " + galaxy.price + "만원에 샀다.");
        System.out.println("영희는 이번에 " + iphone.model + iphone.color + " + 색상을 " + iphone.price + "만원에 샀다.");
    }
}

따라서 클래스는 붕어빵을 만들어내는 틀이라고 할 수 있으며, 객체는 붕어빵 틀에 의해 만들어진 붕어빵이라고 할 수 있다.

  • 객체 생성

    // 클래스 이름 변수명 = new 클래스이름();
    Phone galaxy = new Phone();
  • 객체 접근

    Phone galaxy = new Phone();
     galaxy.model = "Galaxy10";

메소드

메소드는 어떠한 작업을 수행하는 코드를 하나로 묶어 놓은 것이다.
함수라고도 한다.
메소드 내의 변수는 지역변수로, 메소드 내부에서만 사용할 수 있다.
메소드는 다음과 같은 세 가지 요소로 구성된다.

  • 접근 제어자
  • 반환 타입
  • 메소드명
  • 접근 제어자는 메소드의 접근 범위를 제어한다.
  • 반환 타입은 메소드의 실행 결과가 무엇인지 나타낸다.
    void는 메소드의 실행 결과가 없는 메소드, int, double, String 등은 메소드의 실행 결과가 특정 값인 메소드이다.

  • 메소드명은 메소드를 식별하는 이름이다.

예를 들어, 다음은 int 타입의 값을 반환하는 sum() 메소드를 만드는 코드이다.

  • 메소드 선언
    // 반환 타입 메소드명(매개변수1, 매개변수2, ...) {
        // 메소드의 코드
    }
    public int sum(int a, int b) {
        return a + b;
  • 메소드 호출

    [객체 또는 클래스 이름].[메소드 이름]([매개변수])
    //다음과 같은 클래스가 있다고 가정해 보겠습니다.
    
    public class MyClass {
    
        public void printHello() {
            System.out.println("Hello, world!");
        }
    
    }  
    
    MyClass myClass = new MyClass();
    myClass.printHello();

생성자

객체가 생성될 때 사용되는 객체의 초기화 메소드
즉 new 와 같은 키워드로 해당 클래스의 객체가 새로 생성될 때, 자동으로 호출되는 메소드
대표적으로 객체의 변수를 초기화하는 용도의 생성자가 있다.
생성자의 이름은 클래스 명과 같아야하며, 리턴값이 없다는 특징을 지닌다.
클래스를 선언할 때 따로 선언하지 않아도 매개변수와 내용이 없는 디폴트 생성자가 생성된다.

+)팁 alt + insert를 누르면 자동으로 생성자, getter, setter, toString등의 코드를 작성할 수 있다.

  • 생성자 선언
    class 클래스명 {
        // 생성자
        클래스명() {
            // 생성자의 코드
        }
        // ...
    }
    class Person {
        String name;
        int age;
        Person() {
            name = "홍길동";
            age = 30;
        }
        // ...
    }
  • 생성자 호출

    클래스명 객체명 = new 클래스명();
    Person person = new Person();

배열

배열은 같은 자료형의 데이터를 연속된 공간에 저장한 자료 구조입니다. 배열은 다음과 같은 특징을 가지고 있습니다.

자료형
배열은 같은 자료형의 데이터만 저장할 수 있습니다. 예를 들어, 정수형 배열은 정수만 저장할 수 있습니다.

크기
배열은 크기가 고정되어 있습니다. 배열을 선언할 때 배열의 크기를 지정해야 합니다.

인덱스
배열의 각 요소는 고유한 인덱스를 가지고 있습니다. 인덱스는 배열의 요소를 참조하는 데 사용됩니다.

  • 배열선언

    // 정수형 배열
    int[] numbers = new int[10];
    
    // 문자열 배열
    String[] names = new String[5];
  • 배열의 요소에 값을 할당

    numbers[0] = 10;
     numbers[1] = 20;
    
     names[0] = "홍길동";
     names[1] = "김길동";
  • 배열 요소 삭제

    numbers[0] = null;
     names[1] = null;
  • 배열 요소 순회

    for (int i = 0; i < numbers.length; i++) {
        System.out.println(numbers[i]);
    }
    
    for (int i = 0; i < names.length; i++) {
        System.out.println(names[i]);
    }

제어문

if문 : 조건에 따라 실행 여부를 결정
else문 : if문의 조건이 거짓일 때 실행

if (조건식) {
    // 조건식이 참일 때 실행할 코드
} else {
    // 조건식이 거짓일 때 실행할 코드
}

int score = 80;

if (score >= 60) {
    System.out.println("합격");
} else {
    System.out.println("불합격");
}

for문 : 반복 횟수를 지정하여 반복

for (초기식; 조건식; 증감식) {
    // 반복해서 실행할 코드
}

for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

while : 문 조건이 참인 동안 반복

while (조건식) {
    // 반복해서 실행할 코드
}

int i = 1;

while (i <= 10) {
    System.out.println(i);
    i++;
}

상속

상속이란 기존의 클래스를 재사용하는 방식 중의 하나이다.
한 번 작성한 코드가 재사용이 필요하다면, 변경사항만 코드로 작성하므로 상대적으로 적은 양의 코드를 작성할 수 있다.
이렇게 코드를 재사용하면, 코드와 클래스가 많아질수록 관리가 용이하다.

상속을 하게되면

  1. 부모 클래스로에서 정의된 필드와 메소드를 물려 받는다.
  2. 새로운 필드와 메소드를 추가할 수 있다.
  3. 부모 클래스에서 물려받은 메소드를 수정할 수 있다.
  • 상속 선언
class [자식 클래스 이름] extends [부모 클래스 이름] {

    // 자식 클래스에서 정의한 멤버

}
class Phone {
    String model;
    String color;
    int price;
}

class SmartPhone extends Phone {

}

오버로딩, 오버라이딩

  • 오버로딩

한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
메소드 간 이름이 동일해야한다.
단, 매개변수의 개수 및 타입이 전부 동일하다면 오버로딩이 아니다.

int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, long c) {
    long result = a + b + c;
    return result;
}

int add(int a, int b) {
    int result = a + b;
    return result;
}

// 오버로딩의 조건에 부합하는 예제
  • 오버라이딩
    부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것
    상속받은 메소드를 그대로 사용하기도 하지만, 필요에 의해 변경해야할 경우 오버라이딩을 한다.
    부모 클래스의 메소드와 이름, 매개변수, 반환타입이 동일해야한다.
class Animal {
    String name;
    String color;

    public void cry() {
        System.out.println(name + " is crying.");
    }
}

class Dog extends Animal {
	//생성자
    Dog(String name) {
        this.name = name;
    }
	// 오버라이딩
    @Override
    public void cry() {
        System.out.println(name + " is barking!");
    }
    public void swim() {
        System.out.println(name + " is swimming.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("코코");
        // Animal 클래스인 dog는 자식 클래스 Dog의 swim() 사용 불가
        // 쉽게 말해 부모 클래스는 자식 클래스의 메소드를 사용하지 못한다.
        // 하지만 할당 시 오버라이딩한 cry()는 적용되어 is barking이 출력된다.
        dog.cry();
    }
}

자식(Dog) 객체는 자식(Dog) 타입으로 선언된 변수에도 할당할 수 있고, 부모(Animal) 타입으로 선언된 변수에도 할당할 수 있습니다. 단, 부모(Animal) 타입의 변수로 사용할 때는, 실제 객체를 만들(new) 때 사용한 자식(Dog) 타입에 있는 함수 (여기서는 swim())을 호출할 수 없습니다. 컴파일 에러입니다.

즉 오버로딩은 기존에 없는 새로운 메소드를 정의하는 것이며 오버라이딩은 상속받은 메소드의 내용을 변경하는 것이다.

접근제어자

자바에서 접근제어자(access modifier)는 클래스 멤버(필드, 메서드, 생성자)의 접근 범위를 제어하는 키워드입니다.

자바에는 다음과 같은 4가지의 접근제어자가 있습니다.

  • public: 모든 클래스에서 접근할 수 있습니다.
  • protected: 같은 패키지의 클래스와 해당 클래스를 상속받은 클래스에서 - 접근할 수 있습니다.
  • default: 같은 패키지의 클래스에서만 접근할 수 있습니다.
  • private: 같은 클래스에서만 접근할 수 있습니다.

접근제어자는 클래스 멤버의 접근 범위를 제어하여 다음과 같은 이점을 제공합니다.

  • 정보 은닉(information hiding): 불필요한 정보의 노출을 방지하여 코드의 가독성과 보안을 향상시킬 수 있습니다.
  • 캡슐화(encapsulation): 클래스 멤버를 하나의 단위로 묶어 관리할 수 있습니다.
  • 상속(inheritance): 하위 클래스에서 상위 클래스의 멤버를 재사용할 수 있습니다.

접근제어자를 적절하게 사용하면 코드의 품질을 향상시킬 수 있습니다.

연산자

profile
안녕하세요!

1개의 댓글

comment-user-thumbnail
2023년 12월 18일

👍

답글 달기