[Java] 자바의 기본 문법(3)

제어문

프로그램의 흐름을 제어할 때 사용하는 것이 제어문입니다.

  • for, do while, while, if, switch가 있습니다.

if문

if문은 조건에 처리를 나누고 싶을 때 사용하는 구문입니다.

else if와 else 블록은 생략할 수 있습니다.

switch

switch문은 평가값과 같은 case값이 있으면 해당 case의 처리를 실행합니다. 해당 case의 값이 없을 경우 default의 처리를 실행합니다.

  • switch문은 default를 제외한 case문에는 모두 break를 붙여줘야 합니다.
  • break를 사용하는 이유는 swtich문은 자동으로 블록을 빠져나가는 기능이 없기 떄문입니다.

swith문의 평가값으로 사용할 수 있는 자료형은 byte, short, int, enum, String입니다.

for문

처리를 반복해서 실행하고자 할 때 for문을 사용합니다.

확장 for문

for(String str : strArray) { 
} 

카운터를 사용하지 않고 배열이나 Collection 클래스 등의 집합체안의 모든 요소를 하나씩 루프 안에서 가져올 수 있습니다.

  • 문자열을 문자 배열로 반환하는 toCharArray를 사용하면 됩니다.

while문

while문이 조건이 true가 되는 경우나 break문이나 return문을 만날 떄까지 루푸를 반복합니다.

do while문

do while문은 while문과 동일하나 최초 한 번은 무조건 실행하게 합니다.

break문 continue

break문은 for, switch, while문의 처리에서 빠져나갈 떄 사용합니다.

continue문도 for문이나 while문에서 이번 반복을 건너뛸 때 사용됩니다.

  • 반복문 중첩시 break문과 continue는 해당 블록에 적용됩니다.

레이블

outer : for(int i = 0 ; i < 10 ; i++) { 
	for(int j = 0 ; j < 10 ; j++) { 
    	break outer;
    } 
}

위의 방법을 레이블이라고 하는데 레이블을 사용하면 break와 continue를 외부 블록에서 적용시킬 수 있습니다.

return문

return문은 메서드를 종료시킬 떄 사용됩니다.

  • 반환값이 없을 때는 그냥 return;이라고 씁니다.

클래스와 인터페이스

객체지향이란?

객체지향이란 실세계의 사물을 프로그램으로 표현하기 위한 사고방식입니다.

객체

사물이 가진 속성과 행위를 설정, 속성은 그 사물이 가진 정보, 행위는 그 사물이 일으키는 행동

캡슐화, Encapsulation

캡슐화는 외부에서 객체의 속성이나 행위를 호출하는 것을 제한하는 것입니다. 속성값을 정해진 방법으로만 수정하거나 행위를 호출할 수 있는 곳을 제한합니다.

자바에서 캡슐화를 구현할 때 접근 제한자를 사용합니다.

상속, Inheritance

이미 존재하는 클래스의 속성이나 행위를 물려받아 새롭게 정의하는 기능입니다.

상속의 장점

  • 공통부분을 다시 정의할 필요가 없다.
  • 공통부분이 변경되더라도 한번에 수정할 수 있다.

자바에서 상속은 extends를 사용합니다.

상속을 해주는 클래스를 부모 클래스 또는 슈퍼 클래스라고 하며 상속을 받아 새로 만든 클래스를 자식 클래스 또는 서브 클래스라고 합니다.

상속을 이용하면 부모 클래스의 메서드를 재정의할 수 있습니다. 이를 오버라이딩라고 합니다.

클래스를 선언할 때 final을 사용하면 해당 클래스는 상속을 할 수 없게 됩니다.

  • 메서드도 final을 붙이게 되면 오버라이딩 할 수 없게 됩니다.

자식 클래스에서 부모 클래스의 필드와 메서드를 호출할 때는

super.메서드명();

위와 같이 사용합니다.

상속과 생성자

자식 클래스에서 생성자는 일반적인 생성자와 다르게 동작합니다.

  • 자식 클래스의 생성자를 호출하게 되면, 부모 클래스의 생성자도 실행되게 됩니다. 코드 상에는 없어도 컴파일 할 때 자식 클래스의 생성자의 최상단에 super()라는 생성자가 추가되게 됩니다.
  • 만약 super()를 의도를 담아 넣고 싶을 때는 자식 생성자의 최상단에 기재하여야 합니다. 자식 생성자의 다른 부분이위에 있을 경우 컴파일 오류가 발생하게 됩니다.

생성자는 상속되지 않습니다.

다형성, Polymorphism

다형성은 여러 객체의 공통된 속성과 행위를 추출해 하나의 객체로 만드는 것입니다.
다형성을 사용함으로서 공통된 속성과 행위를 가진 객체를 하나로 모아 사용할 수 있습니다.

다형성을 사용하기 위해서는 여러 클래스의 공통 속성이나 행위를 추출해 하나의 클래스를 만들어야 합니다.

  • 이러한 관계를 IS-A 관계라고 합니다.
  • IS-A의 반대는 HAS-A 관계입니다.

다형성을 쉽게 말하면 여러 객체의 공통된 속성과 행위를 추출해 하나의 집합을 만드는 것입니다. 이 다형성을 자바에서 구현할 때 추상 클래스인터페이스를 사용합니다.

추상 클래스, abstract class

추상 클래스는 추상 메서드를 포함한 클래스를 말합니다. 추상 메서드는 반환형, 인수만 정의한 메서드로 즉 구현부 없이 선언부만 존재하는 메서드입니다.

추상 메서드를 포함한 클래스는 abstract를 클래스 선언부에 붙여 추상 클래스임을 명시해야 합니다.

추상메서드는 구현부를 가지지 않으므로 추상 클래스를 상속받는 자식 크래스에서 구현을 해야합니다.

추상 메서드는 반드시 구현해야 한다.

  • 추상 클래스를 상속한 경우 그 클래스에 포함되어 있는 추상 메서드는 반드시 구현해야 합니다.
  • 여러 사람이 하나의 프로그램을 만들 때 구현을 강제함으로써 개발의 획일성을 도모할 수 있습니다.

인터페이스, Interface

인터페이스란 추상메서드만 있는 클래스를 말합니다.

접근제한자 interface 인터페이스명 {
	추상메서드
}

인터페이스는 implements(구현)이라는 키워드를 사용해 자식 클래스를 구현합니다.

위임, Delegation

상속과 비슷한 구현 방법으로 위임이라는 것이 있습니다.

  • 메서드를 처리를 다른 클래스의 메서드 처리를 이용해 구현하는 방법입니다. 처리의 구현을 다른 클래스에 맡기는 방법입니다.

위임은 다른 클래스의 메서드를 이용함으로써 구현하는 수고를 줄일 수 있습니다. 위임은 주로 자바에서 다중 상속을 필요로 하는 경우 사용됩니다.

  • 자바는 다중 상속을 금지하고 있습니다. 위임은 객체의 상호작용이라고 봐도 됩니다.

상속과 위임의 단점

상속 계층이 깊으면 처리를 추적하기 어렵습니다. 코드를 분석할 때 부모 클래스의 처리까지 살펴봐야 하기 때문에 시간이 걸리게 됩니다.
부모 클래스를 수정하면 자식 클래스에 영향을 미친다

제네릭, Generic

제네릭이란 클래스 내부에서 사용할 자료형을 미리 정의해 타입 세이프(type safe, 타입 안정성)을 구현하는 기능입니다.

List<Integer>

제네릭 안에 사용되는 자료형은 기본 자료형이 아닌 래퍼 클래스를 사용합니다.

  • int / Integer
  • long / Long
  • double / Double
  • boolean / Boolean

타입 세이프, Type Safe

형을 지정해 형변환 문제를 방지할 수 있는 상태

제네릭을 클래스 정의할 때 사용

제네릭은 컬렉션 클래스만을 위한 것이 아니라 직접 만든 클래스에서도 사용할 수 있습니다.

public class GenericSample<E> { 
	priavte E object;
    
    public E getObject() {
    	return this.object;
    }
    
    public void setObject(E object) {
    	this.object = object;
    }
}

E라고 적힌 부분은 나중에 사용자가 형을 정할 수 있게 해줍니다.

제네릭을 클래스 정의에 사용함으로써 클래스 정의 안에서 이용하는 형을 인스턴스를 생성할 때 지정할 수 있게 되며, 이때 E를 형식 매개 변수(type parameter)라고 합니다. 관례적으로 형식 매개변수를 E로 표기합니다.

람다식

람다식은 메서드를 간단히 기술하는 기법입니다.

InterfaceSample lamda = (String name) -> {
	System.out.println("이름이 " + name +"입니다.");
}

일반적으로 인터페이스를 구현하려면 클래스를 만들고 메서드를 정의하고 인스턴스로 만드는 과정이 필요합니다. 람다식을 도입하면 이런 복잡한 과정을 간결하게 기술할 수 있습니다.

익명 클래스, anoymous class

람다가 나오기 전에 자바는 익명 클래스를 사용하여 구현했습니다.

익명 클래스는 프로그램의 문 중간에서 클래스를 선언할 수 있는 방법입니다.

InterfaceSanmple anonymous = new InterfaceSample() {
	public void sampleMethod(String name) { 
    	Systme.out.println(name + "입니다.");
    }
}

위의 코드를 람다식으로 변경한다면

InterfaceSample lambda = (String name) -> {
	System.out.println(name + "입니다.");
}

람다식은 코드양을 줄이고 프로그램을 읽기 쉽게 하는 장점이 있습니다.

람다식 사용법

생략기법 - 형 추론에 의한 생산

형 추론(type inference)은 람다식의 인수부분에 형 지정을 생략합니다.

IntefaceSampel lambda = (name) -> {
	retur name + "입니다.";
}

형 추론은 프고르개머가 형을 지정하지 않고 컴파일러가 인수의 형을 추정하는 기능입니다.

생략기법 - 인수가 하나인 경우의 생략

인수가 하나인 경우 괄호를 생략할 수 있습니다.

InterfaceSample lambda = name -> {
	return name + "입니다.";
}

생략기법 - return문만 있는 경우 생략

처리하는 구문이 return문인 경우 return과 처리를 에워싼 괄호를 생략할 수 있습니다.

InterfaceSample lambda = name -> name + "입니다.";

좋은 웹페이지 즐겨찾기