객체 지향 프로그래밍에서 메인의 책임은 무엇입니까?


10

객체 지향 프로그래밍에 익숙하지 않고 메인의 목적이 무엇인지 이해하지 못합니다.

네, 그것이 프로그램의 "진입 지점"이라는 것을 읽었지만 이해하지 못하는 것은 메인에 무엇이 있어야합니까? 그리고 그 책임은 무엇입니까?

메인에 쓰여진 내용이 다른 개체에 캡슐화 될 수 있지만이 방법을 얼마나 사용해야합니까?

Java로 작성한 첫 번째 주요 내용은 다음과 같습니다. 매우 간단하지만 내 의심을 더 잘 이해하게 할 수 있습니다. "Cat"와 "Dog"로 확장 된 추상 클래스 Animal이 있습니다. 메인을 사용하여 일부 객체를 만들고 사용자와의 "인터페이스"로 사용했습니다. 실제로 사용자가 원하는 것을 "사용자에게 요청"하기 위해 조건부 명령을 사용했습니다.

내 질문은 인터페이스가 다른 객체에 캡슐화되어 메인에 대한 책임을지지 않을 수 있다는 사실에서 비롯되었습니다.

    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out.println("What type of animal do you want to create? \n dog cat");
    String type = input.nextLine();
    if ( Objects.equals(type, "dog")){
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Dog first = new Dog(name, age);
    }
    else if ( Objects.equals(type, "cat")) {
        System.out.println("Enter the animal's age: ");
        int age = input.nextInt(); // Scans the next token of the input as an int.
        System.out.println("Enter the animal's name: ");
        String name = input.next();
        Cat first = new Cat(name, age);
    }

    else{
        System.out.println("Error: the specified type does not exist.");
    }
    System.out.println("The number of animals is:" + numberOfAnimals);
}

2
main기능은 OOP의 개념이 아닙니다.
Andres F.

답변:


10

먼저, 예제는 객체 지향 프로그램이 아닙니다. 언어 (자바?)가 구조화 된 데이터를 제공하는 도구이기 때문에 객체에 데이터를 저장하는 절차 적 프로그램입니다.

진정한 객체 지향 프로그램은 객체의 서로 상호 작용하는 구성 - 그것은 관하여 행동 보다는 데이터 (I 그래서, 그 논쟁의 문을 실감 여기 링크의 더 많은 자격 증명을 가진 사람에서 객체 지향의 여러 정의를 볼 수 있습니다 나보다; 행동이 대부분 나타납니다).

진정한 객체 지향 프로그램에서는 내가 사용하는 정의에 따라 상호 작용하는 독립 객체가 있습니다. main기능 의 역할은 초기 객체를 생성하고 함께 연결하는 것입니다.

간단한 예로 데이터베이스 위에 구축 된 웹 응용 프로그램을 생각해보십시오. 이 응용 프로그램은 여러 가지 방법으로 객체로 나눌 수 있지만 여기에는 Networking연결을 허용하고 HTTP 요청을 구문 분석 Controller하며 Database객체와 상호 작용 하고 응답을 생성 하는 적절한 객체로 디스패치 하는 객체 중 하나가 있습니다. 하나 이상의 View객체를 각 컨트롤러와 연결하려면 자유롭게 연결하십시오). Threadpool별도의 실행 스트림을 제공하기 위해 객체를 추가 할 수도 있습니다 .

main이 응용 프로그램에서 의 역할은 다음 과 같습니다.

  1. Database객체 만들기
  2. 의 모든 만들기 Controller오브젝트를하고와 연관 Database객체
  3. Network오브젝트를 작성하고 모든 오브젝트를 연관 Controller시키십시오.
  4. Network실행중인 객체를 시작합니다 (또한 객체를 만들고에 Threadpool연결하는 것을 포함 할 수 있음 Network).

이 설정 단계는에서 명시 적으로 지정 main하거나 다른 객체에서 처리 할 수 ​​있습니다. 예를 들어 일반적인 Spring 애플리케이션에서 main함수가 하는 모든 것은 애플리케이션 컨텍스트 (단일 객체)를 만드는 것입니다. 이로 인해 해당 애플리케이션 컨텍스트의 구성에서 언급 된 모든 오브젝트의 작성 및 배선이 트리거됩니다.


1
OO가 너무 심각하여 방법 과 같은 것이 존재할 수없는 언어의 예는 Newspeak 를 참조하십시오 . main
Jörg W Mittag

1
좋은 대답이지만, 내가 당신이라면 Dependency Injection도 언급했을 것입니다.
Arseni Mourzenko

객체 지향적이 아닌 코드에 대해 무슨 의미인지 알 수 있습니다. 나는 눈치 채지 못했지만 실제로 내가 만든 물건에는 아무런 행동이 없습니다. 그것을 "더 많은 OO"로 만들기 위해 아이디어는 이미 가지고있는 것을 "사용"하는 다른 객체를 만들 수 있습니다.
엘리아

@ 엘리아-아니요, 더 나아지지 않을 것입니다. 구조화 된 데이터를 형식화하고 이름을 지정하는 것에는 가치가 있습니다 (단지에 데이터를 덤프하는 것 Map). 그러나 Java는이를 수행하는 한 가지 방법 만 제공합니다 (C ++과 구조체와 클래스를 구별). 따라서 동작이없는 클래스를 정의하면 프로그램을 이해하기 쉬워 지지만 그렇게하는 것이 프로그램을 "객체 지향"으로 만들지 않는다는 것을 인식해야합니다.
kdgregory

1

글쎄요. 두 가지 극단으로 가져 가십시오.

  1. 에 모든 코드를 한 줄씩 배치하십시오 main. 그것은 잘 컴파일되고 실행될 것입니다. 그러나 인간에게는 코드가 소화되지 않습니다.
  2. 하나의 함수를 main넣고 호출하면 doWhatNeedsToBeDone결국 같은 방식으로이 루틴을 계속합니다. 이제는 매우 깔끔 main하지만 물론해야 할 일을 얻지 못합니다.

따라서 진실은 중간에 있습니다. 생성 시도해보십시오 main누군가가 주요 지침을 수행 할 것을 필요가 무엇을 얻을 수 있도록 한 페이지를 맞. 올바른 경계를 얻는 것은 단순히 경험의 문제입니다.

위의 일반적인 규칙은 기능 프로그래밍뿐만 아니라 OO에도 적용됩니다.


1

정적 주 방법은 비 객체 지향 세계에서 객체 지향 세계로의 전환으로 존재합니다. 80 년대에 적어도 C ++ 이후로 이런 식으로 이루어졌습니다.

정적 메소드는 본질적으로 객체 지향이 아닌 메소드입니다. 절차 적 메소드 일 수 있습니다. 그것들은 기능적인 방법 일 수 있습니다. 정적 메소드의 개념은 본질적으로 다른 프로그래밍 패러다임에 대한 OOP의 탈출입니다.

Java, C # 및 C ++는 모두 정적 C를 기존 C 스타일 기본에서 해당 프로그래밍 언어로의 전환으로 사용하므로 이제 원하는대로 개체를 사용하도록 선택할 수 있습니다.

이러한 언어는 정적 기본 대신 기본 인스턴스 객체가 필요할 수 있지만 정적 기본 방법을 대신 선택했습니다. 인스턴스 접근 방식을 사용하면 main클래스는 클래스의 하위 thread클래스가되고 언어 런타임은 클래스의 초기 객체 인스턴스를 활용 한 main다음 run인스턴스 메소드 를 호출하여 추가 스레드가 시작 / 생성되는 방식과 비슷합니다.

그러나 역사적으로 다른 방식으로 수행되었습니다. 부분적으로, 이러한 언어는 그에 따라 적합하고 부분적으로 그 당시 스레딩이 우선 순위가 아니기 때문에 더 간단한 정적 접근 방식을 사용했기 때문입니다.

또한 정적 주요 접근 방식은 서브 클래 싱을 사용할 필요가 없다는 점에서 "더 단순"하므로 간단한 자습서 프로그램 hello world은 어떤 의미에서는 더 간단 static합니다. 먼저 OOP를 가르치려고합니다.)


-1

Main () 메서드는 프로그램을 실행하는 데 사용됩니다

책임-프로그램 실행을 시작하면 Main () 메소드가 다른 메소드를 호출하여 프로그램 실행을 시작합니다.

이것은 Main () 메서드의 책임이 무엇인지 이해하는 데 도움이되는 간단한 대답입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.