Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[Java] Java & 객체지향 본문

Java

[Java] Java & 객체지향

코드와이 2021. 11. 28. 23:48

Java & 객체지향

  • 장점
    • JVM에서 동작
      • 특정 운영체제에 종속되지 않는다.
    • 객체지향 언어
      • 캡슐화, 상속, 추상화, 다형성 등
      • 비교적 이해하고 배우기 쉽다.
      • 유지보수가 쉽다.
    • GC를 통한 자동 메모리 관리
    • OpenJDK가 오픈소스
    • 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현 가능
  • 단점
    • JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 C나 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다
    • 불편한 예외처리
  • 접근 제어자
    • public(+) : 어떤 클래스의 객체에서든 접근 가능
    • private(-) : 이 클래스에서 생성된 객체들만 접근 가능
    • protected(#) : 이 클래스와 동일 패키지에 있거나 상속 관계에 있는 하위 클래스의 객체들만 접근 가능
    • package(~) : 동일 패키지에 있는 클래스의 객체들만 접근 가능
  • 데이터 타입
    • 기본 데이터 타입
      • byte, short, char, int ...
      • 크기가 작고 고정적이기 때문에 Stack 영역에 저장
    • 참조 타입
      • class, array, interface ...
      • 크기가 가변적이고 동적이기 때문에 Heap에 저장
      • 더 이상 참조하는 변수가 없을 때 GC에 의해 파괴
  • Wrapper class
    • 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수는 없다.
    • 따라서 기본 타입을 객체로 변환시켜주어야 한다.
    • Wrapper class는 java.lang 패키지에 포함되어 제공된다
      기본 타입 래퍼 클래스
      byte Byte
      short Short
      int Integer
      long Long
      float Float
      double Double
      char Character
      boolean Boolean
  • OOP 특징
    • 추상화
      • 구체적인 사물들의 공통적인 특징을 파악하여 이를 하나의 개념으로 다루는 것
    • 캡슐화
      • 정보 은닉 : 필요 없는 정보는 외부에서 접근하지 못하도록 제한
      • 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
    • 일반화 관계(상속)
      • 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
    • 다형성
      • 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
      • 오버라이딩, 오버로딩
        • 오버라이딩
          • 임의의 클래스가 다른 클래스를 상속 받거나 인터페이스를 구현했을 때 상위 클래스 또는 인터페이스에 정의되어 있는 메소드를 재정의하여 사용하는 것이다. 메소드 호출 시 재정의 되어 있지 않다면 상위 클래스의 메소드가 호출된다.
          • public abstract class A {
            
            	public void printMe() { System.out.println("AAA"); }
            	
            }
            
            public class B extends A {
            
            	@Override // 개발자의 실수를 방지하기 위해@Override(annotation) 쓰는 것을 권장
            	public void printMe() { System.out.println("BBB"); }
            
            }
        • 오버로딩
          • 메소드에 주어진 인자에 따라 동작을 다르게 구현할 수 있다. 코드의 중복이 줄어들고 가독성이 늘어난다. 반환형은 관계가 없지만, 인자의 개수, 인자의 타입에 따라 다르게 구현할 수 있다.
          • void example(int a){
            
            	return a;
            	
            }
            
            void example(String a){
            
            	retunr a;
            	
            }
  • OOP 5대 원칙(SOLID)
    • S : 단일 책임 원칙
      • 객체는 단 하나의 책임만 가져야 한다.
    • O : 개방-폐쇄 원칙
      • 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야 한다.
    • L : 리스코프 치환 원칙
      • 자식 클래스는 최소한 자신의 부모 클래스의 기능을 모두 수행할 수 있어야 한다.
    • I : 인터페이스 분리 원칙
      • 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.
    • D : 의존 역전 원칙
      • 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다 변화하기 어렵고 변화가 거의 없는 것에 의존해야 한다.
  • 절차지향 VS 객체지향 프로그래밍
    • 절차지향
      • 절차를 정하고 그 절차에 맞도록 프로그래밍
      • 일의 흐름에 중점
    • 객체지향
      • 객체 간의 관계, 상호 작용을 나타낼 수 있는 함수와 변수를 설계 및 구현
      • 연관되어 있는 함수와 변수를 하나의 그룹으로 묶어서 그룹핑(핵심)
      • 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 된다.(재활용성)
  • 객체지향 장점
    • 객체를 중심으로 프로그래밍하기 때문에 사람의 관점에서 프로그램을 이해하기 쉽다.
    • 강한 응집력, 약한 결합력
    • 재사용성, 확장성, 융통성이 높다.
    • 디버깅과 유지보수가 용이하고 설계와 분석이 쉽다.
  • 객체지향 단점
    • 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생한다.
      • 처리속도 저하
      • but 하드웨어 발전으로 이러한 단점 커버
    • 예상치 못한 부작용 발생 가능
      • 애플리케이션 내에서 버그 발생
  • static
    • 클래스가 로딩될 때 생성
    • 프로그램이 종료될 때 제거
    • 동일한 클래스의 모든 객체들에 의해 공유된다.
  • java의 main 메소드는 왜 static인가?
    • JVM은 인스턴스가 없는 클래스의 main()을 호출해야 되기 때문에 static이어야 한다.
    • JVM & static
      • 코드를 실행하면 컴파일러가 .java 코드를 .class로 변환한다.
      • 클래스 로더가 .class 파일을 메모리 영역에 로드한다.
      • Runtime Data Area 중 MeThod Area( = Static Area)라고 불리는 영역에 Class Variable이 저장되는데, static 변수 또한 여기에 포함된다.
      • JVM이 Method Area에 로드된 main()을 실행한다.
  • 클래스 vs 객체 vs 인스턴스
    • 클래스
      • 객체를 만들어 내기 위한 틀
      • 연관되어 있는 변수와 함수의 집합
    • 객체
      • 구현할 대상
      • 클래스의 인스턴스라고도 불림
      • 모든 인스턴스를 대표하는 포괄적인 의미
      • OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
    • 인스턴스
      • 구현된 구체적인 실체
      • OOP관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
      • 추상적인 개념과 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용
    • public class Animal{
      	...
      }
      
      public class Main {
      	public static void main(String[] args){
      		Animal cat;	// 객체
      		
      		cat = new Animal();	// 인스턴스
      	}
      }
  • Call by Reference vs Call by Value
    • (공통) 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성
    • Call by Reference(참조에 의한 호출)
      • 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달(해당 변수를 가르킴)
      • 따라서 함수 안에서 인자의 값이 변경되면, 인자로 전달된 변수의 값도 함께 변경
    • Call by Value(값에 의한 호출)
      • 함수 호출 시 인자로 전달되는 변수의 값을 복사하여 함수의 인자로 전달
      • 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 갖음
      • 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
    • Java는 Call by Value이다.
      • 기본 자료형의 경우 해당 변수값을 복사해서 전달
      • 참조 자료형일 경우 해당 변수의 값이 레퍼런스이므로 그 레퍼런스를 복사형 전달
  • Reference

'Java' 카테고리의 다른 글

[Java] GC(가비지 콜렉터, Garbage Collector)  (0) 2021.11.28