기억의 실마리
2024. 10. 5. 16:31

🎛️OverRoading

오버로딩이란 특정 클래스나 메서드를 작성할 때 내부에서

추가적으로 이름은 동일하게 작성하고 각기 다른 파라미터를

전달받아 파라미터에 따라서 각기 다른 역할을 수행할 수

있도록 구성하는 방식을 오버로딩(OverRoading)이라고 한다.

(오버라이딩과 오버로딩 착각에 유의하자...)

 

  • 예제코드
public class MemberConstruct {
    String name;
    int age;
    int grade;
    
    MemberConstruct(String name, int age) {
        this(name, age, 45);
        System.out.println("case 1 : grade를 넘겨받지 않은 생성자 메서드 호출");
        System.out.println("name : " + this.name + "\n");
    }

    MemberConstruct(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
        System.out.println("case 2 : grade를 전달받은 생성자 메서드 호출");
        System.out.println("name : " + this.name + "\n");
    }
}

위 예제는 클래스를 생성할 때 전달받는 파라미터에 따라서 다른 결과를 만들어낸다.

 

✍️마치며...

java를 배우면서 javascript에서는 신경쓰지 않아도 될 것들을 모두 지정하거나 추가해주어야 하는 것이 번거롭지만 오히려 좀 더 본질적인 프로그래밍에 가깝다는 느낌 또한 받게되는 것 같다.

 

이후 이어서 dart와 flutter도 공부를 천천히 시작하고 있는데 dart언어 또한 java와 뭔가 비슷하다는 느낌을 지울 수가 없었다. 아직도 모르는게 너무 많고 배울 것이 정말 많다... (오히려 좋아)

2024. 10. 3. 18:05

🐎OverRiding

오버라이딩이란 부모로부터 상속받은 메서드의 기능을

재정의하는 것처럼 보이는 현상을 의미한다

 

특정 클래스에 extends를 활용하여 부모 클래스를 상속한 경우

해당 클래스는 상속한 부모의 메서드를 사용 가능하게 되는데

 

이 때 상속받은 메서드의 기능이 아닌 다른 기능을 필요할 때

overriding을 활용하여 상속받은 메서드를 같은 이름으로

원하는 새로운 기능의 메서드를 생성하여 마치 같은 메서드이지만

재정의한 것 처럼 활용할 수 있다.

 

overriding이 적용되는 방식은 절차적인 접근순서에 의해 적용된다.

 

  • 상속 메서드 실행 예시코드
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

위 예시코드를 보면 Parent 클래스는 walk라는 메드를 가지고 있다.

 

이러한 경우 IHaveParent 인스턴스에서 walk를 호출하면

가장 먼저 IHaveParent클래스 자기 자신에서 부터 해당 메서드를

탐색하게 된다.

 

이 후 탐색할 수 없다면 상속된 부모클래스에서 walk 메서드를

탐색하게 되고 있다면 실행하게 된다.

 

  • Overriding 예시코드
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

		// 자식 요소에도 있는 walk 메서드
        public void walk() {
            	System.out.println("let's walk, alone.");
            }

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
        

}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

위는 overriding이 적용된 예시 코드이다.

 

마찬가지로 특정 메서드를 찾기 위해 메서드를 탐색하고 이 때

"자기 자신이 가진 메서드를 먼저 탐색한다"는 절차적 순서로

호출된 메서드명을 가진 메서드가 부모 뿐만 아니라

자식 클래스에서도 가지고 있다면

 

자식클래스(자기 자신)에서 우선 탐색 후 실행되어 부모가 가진

메서드가 마치 재정의 되어 실행되는 것처럼 보이는 현상을

overriding이라고 한다.

 

서술한대로 탐색 순서에 의해 발생되는 현상이지만

JAVA 개발자들은 이를 의도하여 활용하고자 

Override 라는 어노테이션이 만들었다.

 

부모가 상속된 클래스 내부에서 부모가 가진

메서드명으로 다른 기능의 메서드를 만들고

상단에 Override어노테이션을 사용한다면

해당 메서드명이 부모에 존재한다면 정상 실행되지만

 

해당 메서드명이 존재하지 않는다면 에러를 발생시켜

상속관계를 가진 클래스에서 분명한 의도를 가진

프로그래밍 설계가 가능하도록 활용할 수 있다.

 

  • @Override를 활용한 예시
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

		// Override 어노테이션을 활용
        @Override
        public void walk() {
            	System.out.println("let's walk, alone.");
            }

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
        

}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

 

✍️마치며...

자바를 공부하며 새로운 프로그래밍 개념에 대해서 알아가며 새삼 프로그래밍 자체가 가진 프로세스, 로직은 얼추 비슷하게 적용되고 있음을 깨닫게 되는 것 같다. 특히나 자바와 (타입스크립트 + JS)는  무척이나 유사한 것 같다... 자바를 공부하며 기존에 다루었던 NestJS와도 많이 닮았다는 생각을 했는데 결과적으로는 타입스크립트가 자바를 이해하는데 크게 기여한 것을 느낄 수 있었다. 앞으로도 배워보고 싶은 언어, 프레임워크가 많은 만큼 더 열심히 해야겠다!

2024. 9. 18. 13:54

Data Type

자료의 "형"을 뜻하며 말 그대로 데이터의 타입이다.

필자는 Frontend가 주력인 개발자로서 Javascript를 기본으로

개발을 해왔기 때문에 Typescript 를 활용하지 않는다면

모든 객체(함수, obj, arr 등)와 변수에 별도로 타입을 지정할 일이 없다.

 

하지만 JAVA 언어를 사용하기 위해서는 모든 클래스에

타입 지정이 필수이며, 사실 Javascript를 제외한다면 대다수의

언어에서 타입지정은 필수이다.

 

JAVA에서 정의하는 타입은 Javascript에서 정의하는 타입과 크게

다르지 않고 일부 개념을 제외하면 거의 동일한 구조이다.

Javascript에서 크게 원시타입, 참조타입으로 구분한다면

JAVA에서는 일반형, 참조형으로 구분하고 있다.

 

일반형 (Primitive Type)

Javascript에서는 원시타입으로 불리는 Boolean, Number 등과 비슷한 형태로

메모리상에서 실제 값을 가지고 있는 자료형을 말하며 아래와 같은 일반형이 존재한다.

 

- 기본형 타입의 특징

  1. 소문자로 구성 되어있다.
  2. 변수에 선언과 동시에 초기화되어 null이 아닌 초기값이 존재한다.
  3. 비객체 타입(참조형이 아님)으로 모두 null을 할당받을 수 없다.
  4. 저장공간에 실제 값을 가지고 있다.
  5. 모든 타입은 메모리 Stack에 저장된다.

 

- 오해할 수 있는 문자형 타입

문자형 타입중에 String과 char가 존재한다.

진정한 기본형인 문자형 타입은 char이며,

String은 JAVA에서 문자열을 좀 더 편하게 사용할 수 있도록

제공하는 참조형 타입이다. 그렇기 때문에 타입 구성이

소문자로 되어있지 않고 대문자로 시작하는 "String"인 것이다.

 

  타입 할당 메모리 크기 기본 값 범위
논리형 boolean 1byte false true, false
문자형 char 2byte (Unicode) '\u0000' 0 ~ 65,535
정수형 int (default) 4byte 0 -2,147,483,648 ~ 2,147,483,647
byte 1byte 0 -128 ~ 127
short 2byte  0 -32,768 ~ 32,767
long 8byte 0L -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
실수형 float 4byte 0.0F (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
double (default) 8byte 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값

 

  • 일반형 예제 소스코드
class PrimitiveType() {
	int number;
    boolean isBoolean;
    double isDouble;
}

// number = 0
// isBoolean = false
// isDouble = 0.0

 

 

참조형 (Reference Type)

참조형 타입은 클래스, 배열, 열거형 타입 등을 참조형이라 하며,

변수에 할당되어 메모리상에 존재할 때 null 또는 객체가 가지는

참조가능한 주소를 할당할 수 있다.

 

- 참조형 타입의 특징

  1. 기본형과 다르게 실제 값이 아닌 데이터가 저장 되어있는 주소를 가진다.
  2. 참조형 내부의 값은 메모리 내부 힙(heap)에 저장하고 참조형 데이터가 가진 주소를 통해 접근가능하다.
  3. 참조형 변수는 null로 초기화 가능하고 이는 GC(Garbage Collection) 대상으로 이어질 수 있다.

 

타입 기본 값 할당 메모리 크기
배열 (Array) null 4byte
(주소만을 담기 때문)
열거 (Enumeration) null
클래스 (Class) null
인터페이스 (Interface) null

 

 

  • 참조형 예제 소스코드
class ReferenceType() {
	String title = "Title";
    String[] contents = new String[] { "배열임", "이것은 참조형" }
    Date date = new Date();
    Data data = new Data();
}

// title = "Title"
// contents = main.ref@682a0b20 (패키지경로@참조주소)
// date = main.ref@682a0b21 (패키지경로@참조주소)
// data = main.ref@682a0b22 (패키지경로@참조주소)

class Data() {
	int value;
    char content
}

 

 

마치며...

Javascript를 주력으로 개발을 하다보니 평소 자료형(Data Type)에 대해서 깊게 생각하지 못했던 것 같다. 타 언어에도 관심을 가지고 배우며 점점 개발자로서의 시야도 넓어지는 것 같다. 이번에 JAVA를 공부하면서 Javascript가 얼마나 편한 언어인지 깨닫는 계기가 되었다... JS 최고.