[정보처리기사] Java_연산자, 반복문, 메서드, 클래스, 상속

EunJi·2024년 4월 7일
0

정보처리기사

목록 보기
2/2

6. 연산자

  • 문자열 + (다른 Type) → 문자열
public class Eunji {
	public static void main(String args[]) {
		System.out.println("5 + 2 = " + 3 + 4); // 문자열 + 숫자
		System.out.println("5 + 2 = " + 3.1 + 4); // 문자열 + 숫자
		System.out.println("5 + 2 = " + (3 + 4)); // 문자열 + 숫자
		System.out.println(5 + 2 + " = 3 + 4"); // 숫자 + 문자열
	}
}

// 출력
// 5 + 2 = 34
// 5 + 2 = 3.14
// 5 + 2 = 7
// 7 = 3 + 4

7. 반복문 - for each문

(1) 개념

  • 배열이나 리스트의 크기만큼 반복.
  • 반복할 때마다 배열이나 리스트 항목을 순차적으로 변수에 대입.

(2) 구조

for (제어변수: 배열) {
	문장;
}
public class Eunji {
	public static void main(String args[]) {
		String[] name = {"Choi", "Eun", "Ji"}; // String형 배열 선언
		for (String nm: name) {
			System.out.println(nm);
		}
	}
}

// 출력:
// Choi
// Eun
// Ji

8. 메서드

(1) 사용자 정의 함수 (메서드)

  • 사용자 정의 함수(User-Defined Function)란?
    • 사용자가 직접 새로운 함수를 정의하여 사용하는 방법.
    • 매개변수나 생성된 변수는 사용자 정의 함수가 종료되면 없어짐.
  • 문법
    자료형 함수명(자료형 변수명, ..) {
    	명령어;
    	return 반환값;
    }
    public class Eunji {
    	static char fn(int num) {
    		if (num%2 == 0)
    			return 'Y';
    		else:
    			return 'N';
    	}
    	
    	public static void main(String[] args) {
    		char a = fn(5);
    		System.out.println(a);
    	}
    }
    
    // 출력:
    // N
    (2) static 메서드
    • 클래스가 메모리에 올라갈 때 자동적으로 생성되는 메서드.

    • 인스턴스를 생성하지 않아도 호출 가능.
      - 인스턴스: 클래스로부터 만들어진 객체

      class Eunji {
      	static void print() {
      		System.out.println("static method");
      	}
      	
      	public class EunjiMain {
      		public static void main(String[] args) {
      			Eunji.print();
      			// Eunji alice와 같은 변수 선언 없이,
      			// "클래스명.메서드명" 형태로 호출.
      		}
      	}
      }
      
      // 
      // main 메서드가 포함된 클래스를 기준으로 자바 클래스 이름과 파일이름은 같아야 함.
      // EunjiMain 안에 main이 있으므로,
      // EunjiMain.java 파일에 코드를 넣어서 실행해야함.

9. 클래스

(1) 개념

  • 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 틀.

(2) 클래스 접근 제어자

  • 개념
    • 지정된 클래스, 변수, 메서드를 외부에서 접근할 수 있도록 권한을 설정하는 기능.
  • 클래스 접근 제어자 종류
    종류설명
    public외부의 모든 클래스에서 접근이 가능한 접근 제어자.
    protected- 동일 패키지 내부에 있는 클래스, 하위 클래스에서 접근 가능.
    - 자기 자신과 상속받은 하위 클래스 둘 다 접근 가능.
    default- 접근 제어자를 명시하지 않은 경우.
    • 동일 패키지 내부에 있는 클래스에서 접근 가능.
      (** Java에만 존재하는 접근 제어자) |
      | private | - 같은 클래스 내에서만 접근 가능. |

(3) 클래스 정의

  • 일반적으로 변수는 private 접근 제어자를 사용 → 외부에서 접근 X
  • 메서드는 외부에 공개할 것만 public 접근 제어자를 사용.
    • 그렇지 않으면 protected / default를 사용하여 정보은닉.
    • 정보은닉: 코드 내부 데이터와 메서드를 숨기고 공개 인터페이스를 통해서만 접근이 가능하도록 하는코드 보안 기술.
public class 클래스명 {
	private 반환할_변수명;
	
	public 반환_자료명 메서드명 (자료형 변수명, ...) {
		명령어;
		return 반환값;
	}
}

(4) 클래스 변수 생성

  • 클래스: 객체를 생성하기 위해 변수와 메서드를 정의하는 틀.
  • 실제 변수에 들어갈 인스턴스를 new 키워드로 생성해줘야함.
  • 변수를 사용해 클래스의 메서드에 접근함.
클래스명 변수명 = new 클래스명(파라미터);
변수명.메서드명();

// ex)
Person eunji = new Person();
eunji.birth = "07-28";

(5) 클래스 this

  • this: 현재 객체를 가리키는 키워드.
  • 클래스 내부의 변수와 메서드를 가리킬 수 있음.
public class Person {
	private int a;

	public void setA(int a) {
		this.a = a;
		// 그냥 a라고 한다면 파라미터로 받은 a일수도, Person 내의 변수 a일 수도 있음.
		// 프로그램 내에 같은 이름이 존재할 경우, 가장 가까이 있는 변수를 지칭하게 됨.
		// 즉, 그냥 a라고 하면 매개변수 a를 의미하게 됨.
		// 따라서, 클래스 내의 private 변수 a를 지칭하기 위해 this를 사용.
	}
	
	public int getA() {
		return a;
	}
	
	public static void main(String[] args) {
		Person eunji = new Person(); // eunji라는 변수에 Person 클래스 생성.
		eunji.setA(5);
		System.out.println(eunji.getA());
	}
}

// 출력: 5

(6) 생성자(Constructor)

  • 해당 클래스 객체가 생성될 때 자동으로 호출되는 특수한 종류의 메서드.
  • 일반적으로 클래스의 멤버 변수 초기화 / 클래스를 사용하는 데 필요한 설정이 필요한 경우 사용.
  • 클래스 명과 동일한 메서드명을 가짐. 반환값 X.
  • 생성자가 없을 경우 → public 클래스명() {} 이라는 아무 일도 하지 않는 생성자가 있는 것처럼 동작.
    구분코드
    생성자 정의public class 클래스명 {
      public 클래스명(매개변수) {
          명령어;
      }
    } |
    | 생성자 호출 | 클래스명 클래스변수 = new 클래스명(매개변수); |

(7) 소멸자 (Destructor) - finalize 메서드

  • 객체의 수명이 끝났을 때, 객체를 제거하기 위한 목적.
  • 반환값 X.
    구분코드
    소멸자 정의public class 클래스명 {
      public void finalize (매개변수) {
          명령어;
      }
    } |
    | 소멸자 호출 | 클래스명.finalize(매개변수) |
public class Eunji {
	public Eunji() {
		System.out.println("A");
	}
	
	public Eunji(int a) {
		System.out.println("B: " + a);
	}
	
	public void finalize() {
		System.out.println("C");
	}
	
	public void fn() {
		System.out.println("D");
	}
	
	public static void main(String[] args) {
		Eunji e1 = new Eunji(); // Eunji() 생성자 호출
		Eunji e2 = new Eunji(5); // Eunji(int a) 생성자 호출
		e1.fn();
		e1.finalize();
	}
}

// 출력
// A
// B: 5
// D
// C

10. 클래스 상속

(1) 클래스 상속이란?

  • 객체의 변수와 메서드를 다른 객체가 물려받는 기능.
  • 자식 클래스를 생성하면 무조건 부모 클래스의 생성자를 실행한 후, 자식 클래스의 생성자 실행.

(2) 클래스 상속 문법

  • 부모 클래스 ≈ 상위 클래스 ≈ 슈퍼 클래스
  • 자식 클래스 ≈ 하위 클래스 ≈ 서브 클래스
class 부모_클래스명 {
}

class 자식_클래스명 extends 부모_클래스명 {
}
  • 자식 클래스를 생성하면,
    부모 클래스 생성자를 먼저 방문한 이후, 자식 클래스의 생성자를 방문.
  • 파이썬은 자식 클래스의 생성자만 방문.
class A {
	public void fnA() {
		System.out.println("A");
	}
}

class B extends A {
	public void fnB() {
		System.out.println("B");
	}
}

public class Eunji {
	public static void main(String args[]) {
		B b = new B();
		b.fnA(); // B에 fnA()가 없으므로, 부모 클래스인 A 클래스의 메서드인 fnA() 실행.
		b.fnB();
	}
}

// 출력:
// A
// B

(3) 오버로딩 (Overloading)

  • 동일 이름의 메서드를 매개변수만 다르게 하여 여러 개 정의할 수 있는 기능.
    • 생성자: 클래스명과 동일.
    • 오버라이딩: 부모 자식간 동일 이름의 메서드
  • 특징
    • 메서드 이름이 같아야함.
    • 매개변수 개수가 달라야 함.
    • 매개변수 개수가 같을 경우, 데이터 타입이 달라야 함.
    • 반환형은 같거나 달라도 됨.
class A {
	public void fn() {
		System.out.println("A");
	}
	
	public void fn(int i) {
		System.out.println(i);
	}
	
	public void fn(double d) {
		System.out.println(d);
	}
	
	public int fn(int a, int b) {
		return a + b;
	}
}

public class Eunji {
	public static void main(String args[]) {
		A a = new A(); // A의 생성자 A()를 호출해야하지만, 없으므로 클래스 생성 시 아무일도 일어나지 X.
		a.fn();
		a.fn(7);
		a.fn(10.0);
		System.out.println(a.fn(2, 3));
	}
}

// 출력:
// A
// 7
// 10.0
// 5

(4) 오버라이딩 (Overriding)

  • 하위 클래스에서 상위 클래스의 메서드를 재정의.
  • 특징
    • 오버라이드하고자 하는 메서드가 상위 클래스에 존재해야 함.
    • 메서드 이름이 같아야함.
    • 메서드 매개변수 개수, 데이터 타입이 같아야 함.
    • 메서드 반환형이 같아야 함.
class 부모_클래스명 {
	public 반환_자료명 메서드명(자료형 변수명) {
		명령문;
	}
}

class 자식_클래스명 extends 부모_클래스명 {
	public 반환_자료명 메서드명 (자료형 변수명) {
		// 부모 클래스의 메서드와 반환_자료명, 메서드명, 매개변수 자료형, 매개변수 변수명 동일해야 함.
		명령문;
	}
}
class A {
	public void fn() {
		System.out.println("A");
	}
}

class B extends A {
	public void fn() {
		System.out.println("B");
	}
}

public class Eunji {
	public static void main(String args[]) {
		A a = new B(); // B 클래스를 a라는 변수로 생성.
		// B클래스를 a 변수에 생성하므로, B의 생성자 B()와 A의 생성자 A()를 호출해야 하지만
		// 둘 다 없으므로 실행 X.
		a.fn();
	}
}

// 출력:
// B
class Parent {
	public Parent() {
		System.out.println("A");
	}
	
	public void fn() {
		System.out.println("B");
	}
}

class Child extends Parent {
	public Child() {
		System.out.println("C");
	}
	
	public void fn() {
		System.out.println("D");
	}
}

public class Eunji {
	public static void main(String args[]) {
		Child c = new Child(); // Child의 부모클래스 부터 방문하여 생성자 호출.
		c.fn();
	}
}

// 출력:
// A
// C
// D

(5) 부모 클래스 접근

  • super 키워드를 이용하여 상위 클래스의 변수나 메서드에 접근 가능.
    • super.메서드명();
class A {
	public void fn() {
		System.out.println("A");
	}
}

class B extends A {
	public void fn() {
		super.fn(); // 부모 클래스의 fn() 호출.
		System.out.println("B");
}

public class Eunji {
	public static void main(String args[]) {
		A a = new B();
		a.fn(); // B클래스 내의 fn() 호출.
	}
}

// 출력:
// A
// B
profile
말하는 감자

0개의 댓글